Random



  • Guten Abend,

    meine Frage bezieht sich eher auf C#, da aber um die Uhrzeit kaum jemand antwortet, poste ich sie mal hier rein, da es nicht wirklich um die Sprache geht, sondern eher um die Logik.

    In .NET gibt es eine Klasse, die von −2.147.483.648 bis 2.147.483.647 eine zufällige Zahl erstellen kann. Mein Problem ist, sie kann das gleiche nicht mit unsigned int. Ich dachte mir eine zufällige Zahl in diesem Bereich zu erstellen und wenn sie < 0 ist, nehm ich sie * (-1). Trotzdem könnte ich keine Zahl im z.B. 3 milliarden Bereich erstellen, wüsstet ihr also eventuell eine Lösung?

    Mfg



  • System.Random rnd = new System.Random();
    int zahl = rnd.next(1,100);

    Reicht das?


  • Mod

    Kann man den Integer nicht einfach einem unsigned integer zuweisen um das gewünschte Ergebnis durch die Umwandlung zu bekommen?

    Ansonsten addier doch einfach 2.147.483.648 hinzu.



  • HighLigerBiMBam schrieb:

    System.Random rnd = new System.Random();
    int zahl = rnd.next(1,100);

    Reicht das?

    Hehe, leider nicht :p

    SeppJ schrieb:

    Kann man den Integer nicht einfach einem unsigned integer zuweisen um das gewünschte Ergebnis durch die Umwandlung zu bekommen?

    Ansonsten addier doch einfach 2.147.483.648 hinzu.

    Random rnd = new Random();
    int number = rnd.Next();
    

    Next() gibt nur int Zahlen zurück, es gibt keine unsigned int Version, wodurch ich z.B. keine Zahl im 3 milliarden Bereich generieren kann. Das ich einfach 2.147.483.648 dazu addiere, hatte ich auch zuerst im Sinn, aber wenn z.B. die -5 generiert wird, kann ich somit z.B. nicht die 53.500 generieren, da ich dann 2.147.483.643 rausbekomme.


  • Administrator

    C_Sharp schrieb:

    meine Frage bezieht sich eher auf C#, da aber um die Uhrzeit kaum jemand antwortet, poste ich sie mal hier rein, ...

    Das sehe ich als C# Moderator ja geradezu als Frechheit! Unverschämtheit! Unglaublich! Ich verlange eine Steinigung, Teerung und Federung ... Ich sollte am besten gleich gar nicht helfen ... unglaublich ...

    Aber ich will mal nicht so sein 🤡
    Ganz einfach geht das so:

    Random random = new Random();
    uint number = (uint)(random.NextDouble() * uint.MaxValue);
    

    Grüssli



  • Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ (auch C++0x) in das Forum C# und .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Administrator

    Danke volkard!

    @C_Sharp,
    Willkommen in meinem Reich 😋

    Teuflische Grüssli



  • Dravere schrieb:

    Aber ich will mal nicht so sein 🤡
    Ganz einfach geht das so:

    Random random = new Random();
    uint number = (uint)(random.NextDouble() * uint.MaxValue);
    

    Danke schön, hat mir sehr geholfen 👍



  • Leider kann ich nicht editieren.
    @Dravere:
    Gäbe es jetzt vielleicht noch eine Möglichkeit das einzugrenzen?


  • Administrator

    C_Sharp schrieb:

    Gäbe es jetzt vielleicht noch eine Möglichkeit das einzugrenzen?

    Ja, mit dem Modulo Operator.

    Random random = new Random();
    uint upperLimit = 3000000000;
    uint number = (uint)(random.NextDouble() * uint.MaxValue) % upperLimit;
    

    So sind alle Zahlen zwischen 0 und 3000000000 exklusiv. Falls du die Untergrenze nach oben korrigieren willst, musst du halt etwas dazurechnen und dies vom upperLimit abziehen.

    Grüssli



  • Oder schlichter

    Random random = new Random();
    uint upperLimit = 3000000000;
    uint number = (uint)(random.NextDouble() * upperLimit);
    


  • Dravere schrieb:

    Falls du die Untergrenze nach oben korrigieren willst, musst du halt etwas dazurechnen und dies vom upperLimit abziehen.

    Meinst du so?

    uint upperlimit = 300;
    uint lowerlimit = 5;
    uint number = (uint)(random.NextDouble() * uint.MaxValue) % upperlimit - lowerlimit;
    


  • Ich denke, eher

    uint upperlimit = 300;
    uint lowerlimit = 5;
    uint number = (uint)(random.NextDouble() * uint.MaxValue) % (upperlimit - lowerlimit) + lowerlimit;
    

    oder

    uint upperlimit = 300;
    uint lowerlimit = 5;
    uint number = (uint)(random.NextDouble() * (upperlimit - lowerlimit)) + lowerlimit;
    

  • Administrator

    @volkard,
    lol, stimmt. Eindeutig Zeit ins Nest zu gehen 🙂

    @C_Sharp,
    Mit dem was Volkard eingeführt hat und zusätzlich noch mit Erweiterungsmethoden, könnte man dies so machen:

    static class RandomExtension
    {
      public static uint NextUInt(this Random random, uint lower, uint upper)
      {
        return (uint)(random.NextDouble() * (upper - lower)) + lower;
      }
    }
    
    // ...
    Random random = new Random();
    uint number = random.NextUInt(1000, 5000);
    

    Grüssli



  • Funktioniert 1A, vielen dank 👍



  • Mal noch nen anderer Gedanke:

    Random rnd = new Random(); 
    uint number = rnd.Next() + rnd.Next();
    

    MfG SWW13



  • Oder man nimmt NextBytes() füllt sich damit nen 4 Byte großes Array und bastelt sich damit den uint zusammen



  • SWW13 schrieb:

    Mal noch nen anderer Gedanke:

    Random rnd = new Random(); 
    uint number = rnd.Next() + rnd.Next();
    

    MfG SWW13

    Das geht so nicht! Würfel mal mit 2 6er Würfeln und siehe was passiert... Die Wharscheinlichkeit dass die 7 fällt ist höher als die 2. Selbes Prinzip bei deiner These.


Anmelden zum Antworten