Wie generiert man eine Zufallszahl zwischen 0 und 1?

Lesezeit: 5 Minuten

Benutzer-Avatar
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

Benutzer-Avatar
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

double r2()
{
    return (double)rand() / (double)RAND_MAX ;
}

Verwenden (double)rand() / (double)((unsigned)RAND_MAX + 1) wenn der Ausschluss von 1,0 beabsichtigt war.

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.

    – Clifford

    Jun 2, 2011 at 19:44


double r2()
{
   return (rand() % 10001) / 10000.0;
}

user avatar
Stealth Rabbi

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.

http://pubs.opengroup.org/onlinepubs/009695399/functions/rand.html
http://www.thinkage.ca/english/gcos/expl/c/lib/rand.html

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

Benutzer-Avatar
Hiesso

Haben Sie versucht mit: Ersetzen von ((rand() % 10000) / 10000.0), mit: (rand() % 2). Das hat bei mir funktioniert!

Du könntest also so etwas machen:

double r2()
{
     srand(time(NULL));
     return(rand() % 2);
}

  • 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

1373900cookie-checkWie generiert man eine Zufallszahl zwischen 0 und 1?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy