Wie erzeuge ich Zufallszahlen ohne rand()-Funktion?
Lesezeit: 3 Minuten
AnkurVj
Ich möchte (Pseudo-) Zufallszahlen zwischen 0 und einer ganzen Zahl generieren. Ich habe nichts dagegen, wenn sie nicht zu zufällig sind. Ich habe Zugriff auf die aktuelle Uhrzeit, aber nicht auf die Randfunktion. Kann sich jemand einen ausreichend robusten Weg vorstellen, um diese zu generieren? Vielleicht einige Bits von der Tageszeit verwerfen und Modulo meiner ganzen Zahl nehmen oder so?
Ich benutze c.
Das klingt nach Hausaufgaben. Wenn dies der Fall ist, sollten Sie es mit dem Tag “Hausaufgaben” versehen.
– Josh Darell
29. September 2011 um 20:19 Uhr
Wenn Sie Zugriff auf google.com haben, suchen Sie nach: “Zufallszahlengenerator”.
– DwB
29. September 2011 um 20:19 Uhr
Warum nicht einfach ablesen /dev/random? Oder verwenden Sie die xkcd-Methode.
– Benutzer142019
29. September 2011 um 20:21 Uhr
Was hindert Sie daran, einfach zu verwenden random() dann?
– Staven
29. September 2011 um 20:24 Uhr
rand() wird normalerweise sehr einfach implementiert (mit einer einfachen Multiplikation des Seeds und dann einer Mischung) … es geht normalerweise um eine Zeile. Google es einfach.
Der Wikipedia-Artikel enthält einige Code-Schnipsel, die Sie sich ansehen können, aber im Grunde sieht der Code für einen 16-Bit-Generator in etwa so aus (leicht massiert von dieser Seite …)
Genau das, was ich brauchte! eine sehr einfache und elegante Lösung
– AnkurVj
29. September 2011 um 21:51 Uhr
Das funktioniert. Sie müssen nur den lfsr ändern, wenn Sie einen anderen Nummernstrom benötigen
– dilanSachi
15. Mai 2020 um 8:41 Uhr
Dennis
Für “nicht zu zufällige” Ganzzahlen könnten Sie mit der aktuellen UNIX-Zeit beginnen und dann die rekursive Formel verwenden r = ((r * 7621) + 1) % 32768;. Die n-te zufällige Ganzzahl zwischen 0 (inklusive) und M (exklusiv) wäre r % M nach der n-ten Iteration.
Dies wird als linearer Kongruenzgenerator bezeichnet.
Die Rekursionsformel ist was bzip2 verwendet, um den Pivot in seiner Quicksort-Implementierung auszuwählen. Ich würde nichts über andere Zwecke wissen, aber es funktioniert ziemlich gut für diesen speziellen …
Sehen Sie sich die Implementierung eines Pseudo-Zufallsgenerators an (was “drin” ist) rand()) von Ihnen, zum Beispiel die Mersenne-Twister ist hoch angesehen.
Rajan Saha Raju
#include <chrono>
int get_rand(int lo, int hi) {
auto moment = std::chrono::steady_clock::now().time_since_epoch().count();
int num = moment % (hi - lo + 1);
return num + lo;
}
Der einzige “robuste” (nicht leicht vorhersehbare) Weg, dies zu tun, besteht darin, einen eigenen Pseudozufallszahlengenerator zu schreiben und ihn mit der aktuellen Uhrzeit zu versehen. Obligatorischer Wikipedia-Link: http://en.wikipedia.org/wiki/Pseudorandom_number_generator
es ist reines c und einfach zu bedienen. ZB nur mit Zeit:
#include "tinymt32.h"
// And if you can't link:
#include "tinymt32.c"
#include <time.h>
#include <stdio.h>
int main(int argc, const char* argv[])
{
tinymt32_t state;
uint32_t seed = time(0);
tinymt32_init(&state, seed);
for (int i=0; i<10; i++)
printf("random number %d: %u\n", i, (unsigned int)tinymt32_generate_uint32(&state));
}
Haseb Mir
Das kleinste und einfachste Zufallsgenerator die mit arbeiten reicht ist unten mit einem voll funktionsfähigen Beispiel versehen.
unsigned int MyRand(unsigned int start_range,unsigned int end_range)
{
static unsigned int rand = 0xACE1U; /* Any nonzero start state will work. */
/*check for valid range.*/
if(start_range == end_range) {
return start_range;
}
/*get the random in end-range.*/
rand += 0x3AD;
rand %= end_range;
/*get the random in start-range.*/
while(rand < start_range){
rand = rand + end_range - start_range;
}
return rand;
}
int main(void)
{
int i;
for (i = 0; i < 0xFF; i++)
{
printf("%u\t",MyRand(10,20));
}
return 0;
}
13853200cookie-checkWie erzeuge ich Zufallszahlen ohne rand()-Funktion?yes
Das klingt nach Hausaufgaben. Wenn dies der Fall ist, sollten Sie es mit dem Tag “Hausaufgaben” versehen.
– Josh Darell
29. September 2011 um 20:19 Uhr
Wenn Sie Zugriff auf google.com haben, suchen Sie nach: “Zufallszahlengenerator”.
– DwB
29. September 2011 um 20:19 Uhr
Warum nicht einfach ablesen
/dev/random
? Oder verwenden Sie die xkcd-Methode.– Benutzer142019
29. September 2011 um 20:21 Uhr
Was hindert Sie daran, einfach zu verwenden
random()
dann?– Staven
29. September 2011 um 20:24 Uhr
rand() wird normalerweise sehr einfach implementiert (mit einer einfachen Multiplikation des Seeds und dann einer Mischung) … es geht normalerweise um eine Zeile. Google es einfach.
– Seifenkiste
29. September 2011 um 20:40 Uhr