2017-09-08 2 views
1

In Bash gibt es einige Variablen (wie $RANDOM), die eingebaute Funktionen sind. Soweit ich weiß, verwendet $RANDOM die C-Funktion random (z. B. man random).

Aber ich musste über diese Informationen stolpern. Was ich tun wollte, war etwas wie man $RANDOM oder type $RANDOM (oder sogar help $RANDOM).

Das Problem, das mit dem Versuch wird $RANDOM wird :-)

auf die tatsächliche Zufallszahl ausgewertet

Wie erkennen Sie, was die Implementierung für eine spezielle integrierte Variable wie $RANDOM ist? Anders als den Bash-Quellcode zu durchsuchen, für den ich gerade keine Gehirnkapazität habe.

Sicherlich gibt es einen Weg um die Schale zu zeigen, welche Implementierung eine spezielle Variable hat (zB „das ist eine integrierte Variable, die auf einer C-Funktion weist der <N> name“) zu erhalten

Oder vielleicht gibt isn‘ t? * Zuckt mit den Schultern *

Jede Hilfe/Informationen über das würde :-)

Dank geschätzt!

Antwort

1

von man bash, /RANDOM

RANDOM Each time this parameter is referenced, a random integer between 0 and 32767 is generated. The sequence of random numbers may be initialized by assigning a value to RANDOM. If RANDOM is unset, it loses its 
     special properties, even if it is subsequently reset. 

Handbuch sagt nicht, wie es umgesetzt wird.

ansonsten aus sources: variables.c zeigt, dass RANDOM verknüpft ist get_random

INIT_DYNAMIC_VAR ("RANDOM", (char *)NULL, get_random, assign_random); 

funktionieren die get_random_number aufruft, und seedrandbrand

/* A linear congruential random number generator based on the example 
    one in the ANSI C standard. This one isn't very good, but a more 
    complicated one is overkill. */ 

/* Returns a pseudo-random number between 0 and 32767. */ 
static int 
brand() 
{ 
    /* From "Random number generators: good ones are hard to find", 
    Park and Miller, Communications of the ACM, vol. 31, no. 10, 
    October 1988, p. 1195. filtered through FreeBSD */ 
    long h, l; 

    /* Can't seed with 0. */ 
    if (rseed == 0) 
    rseed = 123459876; 
    h = rseed/127773; 
    l = rseed % 127773; 
    rseed = 16807 * l - 2836 * h; 
#if 0 
    if (rseed < 0) 
    rseed += 0x7fffffff; 
#endif 
    return ((unsigned int)(rseed & 32767));  /* was % 32768 */ 
} 
Verwandte Themen