2016-04-07 4 views
0

Ich verwende derzeit diesen Code, um einige Variablen zu randomisieren.Ist es eine gute Idee, die gesamte rand() -Tabelle zu verwenden?

srand(time(NULL)); 
do{vkmhrand = rand();vkmh = vkmhrand/78;}while(vkmh <= 0 || vkmh > vmax); 

vmax nicht 415 überschreiten, was bedeutet, dass, wenn ich es so einfach machen wie vkmh = rand() die Mehrheit der randomisierten Tabelle verworfen wird, und ich auch ein paar netten Dezimalzahlen, die Ergebnisse zu machen ein bisschen interessanter.

Ich weiß rand() ist nicht die beste zufällige Funktion in Existenz zu verwenden. Ich denke nur im Allgemeinen, ist es eine gute Idee, so viel wie möglich vom Tisch zu benutzen? Ist es Zeitverschwendung? Oder verschlimmert es irgendwelche Muster, die möglicherweise bereits in der Tabelle vorhanden sind?

+0

Was meinst du mit * randomisierten Tabelle *? –

+0

Die Tabelle der Werte, die die Funktion rand() verwendet, wenn Sie sie aufrufen. –

+0

Die Tabelle selbst ist ziemlich gut pseudozufällig bereits, ich konnte mir nicht vorstellen, dass das Ergreifen der ganzen Tabelle im Gegensatz zu einem bestimmten Abschnitt zufälliger wäre. Offensichtlich ist man aber da ist kein Grund, warum die ganze Tabelle wäre es, vielleicht könnte Ihr kleines Segment zufälliger sein (zufällig). Keine Möglichkeit, wirklich zu wissen, ohne zu testen, und selbst dann nicht signifikant genug, um Ihre Zeit wert zu sein. –

Antwort

0

verwenden, ich bin bürgt nicht für seine Zufälligkeit obwohl

srand(time(NULL)); 
do { 
    vkmhrand = rand() % 415; 
    vkmh = vkmhrand/78; 
} 
while(vkmh <= 0 || vkmh > vmax); 
1

die Ausgabe von rand() Skalierung effektiv in Ihrem Fall bedeutet, dass Sie mehr seiner Bits verwenden können. Unter der Annahme, dass ihr Wert unabhängig voneinander ist (was wahrscheinlich nicht für alle Implementierungen von rand() gilt), ist dies im Allgemeinen eine gute Sache. Sie müssen jedoch beachten, dass diese zusätzlichen Bits nicht verwendet werden, um die höherwertigen Bits "zufälliger" (weniger vorhersagbar) zu machen, sondern nur, um Ihnen mehr Dezimalstellen zu geben, so dass Ihr Lösungsraum eine feinere Auflösung hat.

Der übliche Weg, schwimmt in einem bestimmten Bereich würde zu generieren:

double vkmh = (double) rand()/RAND_MAX * (vmax-vmin) + vmin; 

wenn Sie wäre es gut mit ints, die übliche Art und Weise:

unsigned int = rand() % (vmax - vmin + 1) + vmin; 

Obwohl dies in a führen leicht schief Verteilung, wenn RAND_MAX ist kein Vielfaches von (vmax - vmin + 1) verteilten Werte

Verwandte Themen