Wie generiert man eine Zufallszahl zwischen 0 und 1?
Lesezeit: 5 Minuten
Benutzer739062
Ich möchte Zufallszahlen zwischen (0,1) generieren. Ich versuche folgendes:
double r2()
{
return((rand() % 10000) / 10000.0);
}
int SA()
{
double u;
u = r2();
}
Aber es bringt nicht das erwartete Ergebnis. Wie kann ich es reparieren?
Definieren Sie “nicht korrekte Ergebnisse”, erhalten Sie möglicherweise eine bessere Antwort.
– BugFinder
2. Juni 2011 um 18:05 Uhr
und btw. SA() gibt nichts zurück.
– Howard
2. Juni 2011 um 18:07 Uhr
Ich habe nicht den ganzen Code gegeben. Das ist der Teil, wo etwas schief läuft.
– Benutzer739062
2. Juni 2011 um 18:08 Uhr
Ihr Code funktioniert gut für mich (nachdem SA etwas zurückgegeben hat).
– Juri Stuken
2. Juni 2011 um 18:09 Uhr
Wie prüfen Sie das u ist kein “richtiges Ergebnis”?
– pmg
2. Juni 2011 um 18:13 Uhr
Clifford
In deiner Version rand() % 10000 ergibt eine ganze Zahl zwischen 0 und 9999. Da RAND_MAX nur 32767 betragen kann und da dies nicht genau durch 10000 teilbar und relativ zu 10000 nicht groß ist, wird es eine signifikante Verzerrung in der “Zufälligkeit” des Ergebnisses geben, außerdem wird der Maximalwert 0,9999 sein, nicht 1,0 , und Sie haben Ihre Werte unnötigerweise auf vier Dezimalstellen beschränkt.
Es ist eine einfache Arithmetik, eine Zufallszahl dividiert durch die maximal mögliche Zufallszahl ergibt eine Zahl von 0 bis einschließlich 1, wobei die volle Auflösung und Verteilung des RNG genutzt wird
Hier ist ein allgemeines Verfahren zum Erzeugen einer Zufallszahl in einem bestimmten Bereich:
int randInRange(int min, int max)
{
return min + (int) (rand() / (double) (RAND_MAX + 1) * (max - min + 1));
}
Je nach verwendetem PRNG-Algorithmus wird die % Operator kann zu einem very führen nicht-zufällige Zahlenfolge.
Wenn der Bereich wie in der Frage 0 bis 1 ist, gibt diese Funktion jedes Mal null zurück. Es sollte vielleicht ein Double zurückgeben. Was wäre, wenn ein nicht ganzzahliger Bereich erforderlich wäre? In jedem Fall ist dies für die ursprüngliche Anforderung etwas überspezifiziert.
– Clifford
2. Juni 2011 um 20:01 Uhr
@Clifford Wie wird das jedes Mal 0 zurückgeben? (max-min+1) ist 2 was bedeutet die rand() bit gibt eine Zahl zurück [0-2) which when truncated with (int) should roll 0 or 1 with equal probability.
– mpen
Jul 24, 2014 at 23:29
It took three years for anyone to notice, and it even got a vote! I must have been confused by all the parentheses. However the original question implies a requirement for a double in the range 0 to 1, and this returns an int. Also RAND_MAX + 1 may overflow.
– Clifford
Jul 25, 2014 at 7:55
If this function is desired then it can be implemented using Clifford’s function: return min+(int)(r2()*(max-min+1));
– jack
Dec 21, 2014 at 16:21
RAND_MAX + 1 can easily be INT_MIN or UB. Suggest (RAND_MAX/2 + 1)*2.0
– chux – Reinstate Monica
Jul 16, 2019 at 4:37
It seems to me you have not called srand first.
Usage example here.
That may not matter, and in some cases is undesirable (if you want repeatable testing for example), moreover this is obviously only a fragment, and is not teh cause of his problem.
Set the seed using srand(). Also, you’re not specifying the max value in rand(), so it’s using RAND_MAX. I’m not sure if it’s actually 10000… why not just specify it. Although, we don’t know what your “expected results” are. It’s a random number generator. What are you expecting, and what are you seeing?
As noted in another comment, SA() isn’t returning anything explicitly.
From Generating random number between [-1, 1] in C? ((float)rand())/RAND_MAX gibt eine Fließkommazahl in zurück [0,1]
Ich habe srand(time(NULL)) verwendet; und das Ergebnis, das ich bekomme, ist zum Beispiel 7,8. Ich möchte Zahlen zwischen (0,1).
– Benutzer739062
2. Juni 2011 um 18:40 Uhr
Ja … wir wissen, dass Sie (0,1) wollen, es steht zweimal in der Frage/Beschreibung. Woher sollten wir wissen, dass Sie srand() verwendet haben? Was ist mit der Angabe des Maximalwerts für rand()? Sie sagen auch, dass Sie “offensichtlich” printf verwendet haben. Wie ist das für uns offensichtlich, wenn Sie uns nur Teile Ihres Codes geben? Helfen Sie uns, Ihnen zu helfen.
– Stealth-Rabbi
2. Juni 2011 um 18:44 Uhr
Wie kann ich den maximalen Wert für rand() angeben? Sie müssen nicht gemein sein, ich habe es ohne srand() verwendet und ich habe die gleichen Ergebnisse erhalten.
– Benutzer739062
2. Juni 2011 um 18:53 Uhr
Hmm, ich dachte, Sie können einen int-Wert angeben, der an rand() übergeben wird, mein Fehler. Ich würde jedoch durch RAND_MAX teilen/modifizieren. stackoverflow.com/questions/1557208/…
– Stealth-Rabbi
2. Juni 2011 um 19:12 Uhr
vielen Dank und Entschuldigung für den Mittelwert …. aber ich habe viele wütende Antworten bekommen! Ich habe herausgefunden, was ich falsch gemacht habe! vielen, vielen Dank, dass Sie sich die Zeit genommen haben, mein Problem zu lösen! 🙂
– Benutzer739062
2. Juni 2011 um 19:17 Uhr
Hiesso
Haben Sie versucht mit: Ersetzen von ((rand() % 10000) / 10000.0), mit: (rand() % 2). Das hat bei mir funktioniert!
Ich habe srand(time(NULL)) verwendet; und das Ergebnis, das ich bekomme, ist zum Beispiel 7,8. Ich möchte Zahlen zwischen (0,1).
– Benutzer739062
2. Juni 2011 um 18:40 Uhr
Ja … wir wissen, dass Sie (0,1) wollen, es steht zweimal in der Frage/Beschreibung. Woher sollten wir wissen, dass Sie srand() verwendet haben? Was ist mit der Angabe des Maximalwerts für rand()? Sie sagen auch, dass Sie “offensichtlich” printf verwendet haben. Wie ist das für uns offensichtlich, wenn Sie uns nur Teile Ihres Codes geben? Helfen Sie uns, Ihnen zu helfen.
– Stealth-Rabbi
2. Juni 2011 um 18:44 Uhr
Wie kann ich den maximalen Wert für rand() angeben? Sie müssen nicht gemein sein, ich habe es ohne srand() verwendet und ich habe die gleichen Ergebnisse erhalten.
– Benutzer739062
2. Juni 2011 um 18:53 Uhr
Hmm, ich dachte, Sie können einen int-Wert angeben, der an rand() übergeben wird, mein Fehler. Ich würde jedoch durch RAND_MAX teilen/modifizieren. stackoverflow.com/questions/1557208/…
– Stealth-Rabbi
2. Juni 2011 um 19:12 Uhr
vielen Dank und Entschuldigung für den Mittelwert …. aber ich habe viele wütende Antworten bekommen! Ich habe herausgefunden, was ich falsch gemacht habe! vielen, vielen Dank, dass Sie sich die Zeit genommen haben, mein Problem zu lösen! 🙂
– Benutzer739062
2. Juni 2011 um 19:17 Uhr
13739000cookie-checkWie generiert man eine Zufallszahl zwischen 0 und 1?yes
Definieren Sie “nicht korrekte Ergebnisse”, erhalten Sie möglicherweise eine bessere Antwort.
– BugFinder
2. Juni 2011 um 18:05 Uhr
und btw.
SA()
gibt nichts zurück.– Howard
2. Juni 2011 um 18:07 Uhr
Ich habe nicht den ganzen Code gegeben. Das ist der Teil, wo etwas schief läuft.
– Benutzer739062
2. Juni 2011 um 18:08 Uhr
Ihr Code funktioniert gut für mich (nachdem SA etwas zurückgegeben hat).
– Juri Stuken
2. Juni 2011 um 18:09 Uhr
Wie prüfen Sie das
u
ist kein “richtiges Ergebnis”?– pmg
2. Juni 2011 um 18:13 Uhr