Frage Wie erzeuge ich eine zufällige int-Nummer in C #?


Wie generiere ich eine zufällige Ganzzahl in C #?


1427
2018-04-24 23:09


Ursprung


Antworten:


Das Random Klasse wird zum Erstellen von Zufallszahlen verwendet. (Pseudozufällig, das ist natürlich.).

Beispiel:

Random rnd = new Random();
int month = rnd.Next(1, 13); // creates a number between 1 and 12
int dice = rnd.Next(1, 7);   // creates a number between 1 and 6
int card = rnd.Next(52);     // creates a number between 0 and 51

Wenn Sie mehr als eine Zufallszahl erstellen, sollten Sie die Random Instanz und verwenden Sie es erneut. Wenn Sie neue Instanzen zu nah an der Zeit erstellen, werden sie die gleiche Reihe von Zufallszahlen erzeugen, wie der Zufallsgenerator aus der Systemuhr gesetzt wird.


1889
2018-04-24 23:19



Jedes Mal, wenn Sie neu Random () tun, wird es initialisiert. Dies bedeutet, dass Sie in einer engen Schleife oft den gleichen Wert erhalten. Sie sollten eine einzelne Random-Instanz beibehalten und Next weiterhin für dieselbe Instanz verwenden.

//Function to get random number
private static readonly Random getrandom = new Random();

public static int GetRandomNumber(int min, int max)
{
    lock(getrandom) // synchronize
    {
        return getrandom.Next(min, max);
    }
}

181
2017-10-04 11:52



Die Frage sieht sehr einfach aus, aber die Antwort ist etwas kompliziert. Wenn Sie sehen, hat fast jeder vorgeschlagen, die Random-Klasse zu verwenden, und einige haben vorgeschlagen, die RNG-Crypto-Klasse zu verwenden. Aber dann wann, was zu wählen.

Dafür müssen wir zunächst den Begriff RANDOMNESS und die dahinter stehende Philosophie verstehen.

Ich möchte Sie ermutigen, dieses Video zu sehen, das in der Philosophie von RANDOMNESS mit C # vertieft. https://www.youtube.com/watch?v=tCYxc-2-3fY 

Als erstes sollten wir die Philosophie der ZUFÄLLIGKEIT verstehen. Wenn wir einer Person sagen, dass sie zwischen ROT, GRÜN und GELB wählen soll, was intern geschieht. Was bewirkt, dass eine Person ROT oder GELB oder GRÜN wählt?

c# Random

Ein erster Gedanke geht in den Verstand der Personen, der seine Wahl entscheidet, es kann Lieblingsfarbe, glückliche Farbe und so weiter sein. Mit anderen Worten, ein Anfangstrigger, den wir in RANDOM als SEED bezeichnen. Dieser SEED ist der Anfangspunkt, der Trigger, der ihn dazu bringt, den RANDOM-Wert zu wählen.

Wenn nun ein SEED leicht zu erraten ist, dann wird diese Art von Zufallszahlen als bezeichnet PSEUDO und wenn ein Samen schwer zu erraten ist, werden diese Zufallszahlen genannt GESICHERT zufällige Zahlen.

Zum Beispiel wählt eine Person die Farbe abhängig von Wetter und Klangkombination, dann wäre es schwierig, den Anfangssamen zu erraten.

c# Random

Lassen Sie mich nun eine wichtige Aussage machen:

* "Random" -Klasse erzeugt nur PSEUDO-Zufallszahl und um SECURE-Zufallszahl zu generieren, müssen wir die "RNGCryptoServiceProvider" -Klasse verwenden.

c# Random

Die Random-Klasse nimmt Startwerte aus Ihrer CPU-Uhr, die sehr vorhersehbar sind. Mit anderen Worten erzeugt die RANDOM-Klasse von C # Pseudozufallszahlen, darunter ist der Code für dieselbe.

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

Während die RNGCryptoServiceProvider-Klasse OS-Entropie verwendet, um Seeds zu generieren. Die OS-Entropie ist ein zufälliger Wert, der unter Verwendung von Sound-, Mausklick- und Tastatur-Timings, thermischen Temp usw. erzeugt wird. Unten folgt der Code für denselben.

using (RNGCryptoServiceProvider rg = new RNGCryptoServiceProvider()) 
{ 
  byte[] rno = new byte[5];    
  rg.GetBytes(rno);    
  int randomvalue = BitConverter.ToInt32(rno, 0); 
}

Um die OS-Entropie zu verstehen, sehen Sie sich dieses Video an https://www.youtube.com/watch?v=tCYxc-2-3fY   ab 11:20, wo die Logik der OS-Entropie erklärt wird. Mit einfachen Worten erzeugt RNG Crypto sichere Zufallszahlen.


151
2018-06-14 06:27



Pass auf das auf new Random() wird auf dem aktuellen Zeitstempel gesetzt.

Wenn Sie generieren möchten nur eine NummerSie können verwenden:

new Random().Next( int.MinValue, int.MaxValue )

Weitere Informationen finden Sie unter Zufällig Klasse, aber bitte beachten Sie:

Da die Uhr jedoch über eine begrenzte Auflösung verfügt, werden mit dem parameterlosen Konstruktor Zufallszahlengeneratoren erzeugt, die identische Folgen von Zufallszahlen erzeugen

Verwenden Sie diesen Code nicht, um eine Zufallszahl zu generieren.


72
2018-04-24 23:10



Random r = new Random();
int n = r.Next();

42
2018-04-24 23:10



Ich wollte eine kryptografisch sichere Version hinzufügen:

RNGCryptoServiceProvider-Klasse (MSDN oder Dotnetperls)

Es implementiert IDisposable.

using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
   byte[] randomNumber = new byte[4];//4 for int32
   rng.GetBytes(randomNumber);
   int value = BitConverter.ToInt32(randomNumber, 0);
}

22
2017-12-18 21:02



Es ist besser, das Random-Objekt mit den aktuellen Millisekunden zu setzen, um eine echte Zufallszahl zu gewährleisten, und Sie werden Dubletten fast nicht mehr häufig finden

Random rand = new Random(DateTime.Now.Millisecond);

13
2017-11-01 12:30



Du könntest Jon Skeets benutzen StatischesRandom Methode in der MiscUtil-Klassenbibliothek, die er für eine Pseudozufallszahl erstellt hat.

using System;
using MiscUtil;

class Program
{
    static void Main(string[] args)
    {
        for (int i = 0; i < 100; i++)
        {
            Console.WriteLine(StaticRandom.Next());
        }
    }
}

12
2018-04-24 23:31



Ich habe alle diese Lösungen ausprobiert, ausschließlich der COBOL-Antwort ... lol

Keine dieser Lösungen war gut genug. Ich brauchte Randoms in einer Fast-for-Int-Schleife und ich bekam Tonnen von doppelten Werten sogar in sehr weiten Bereichen. Nachdem ich mich viel zu lange für zufällige Ergebnisse entschieden hatte, beschloss ich, dieses Problem endlich ein für allemal anzugehen.

Es geht nur um den Samen.

Ich erstelle eine zufällige Ganzzahl, indem ich die Nicht-Ziffern von Guid analysiere, dann benutze ich das, um meine Random-Klasse zu instantiieren.

public int GenerateRandom(int min, int max)
{
    var seed = Convert.ToInt32(Regex.Match(Guid.NewGuid().ToString(), @"\d+").Value);
    return new Random(seed).Next(min, max);
}

Aktualisieren: Das Seeding ist nicht notwendig, wenn Sie die Random-Klasse einmal instanziieren. Daher wäre es am besten, eine statische Klasse zu erstellen und eine Methode aufzurufen.

public static class IntUtil
{
   private static Random random;

   private static void Init()
   {
      if (random == null) random = new Random();
   }

   public static int Random(int min, int max)
   {
      Init();
      return random.Next(min, max);
   }
}

Dann können Sie die statische Klasse wie folgt verwenden ..

for(var i = 0; i < 1000; i++)
{
   int randomNumber = IntUtil.Random(1,100);
   Console.WriteLine(randomNumber); 
}

Ich gebe zu, ich mag diesen Ansatz besser.


10
2018-05-19 21:19



Die Zahlen, die vom eingebauten generiert werden Random class (System.Random) generiert Pseudozufallszahlen.

Wenn Sie echte Zufallszahlen wollen, ist der "sichere Pseudo - Zufallsgenerator" der am nächsten kommt, den wir erzeugen können, indem wir die kryptografischen Klassen in C # wie RNGCryptoServiceProvider.

Trotzdem, wenn du noch brauchst wahr Zufallszahlen müssen Sie eine externe Quelle wie Geräte für den radioaktiven Zerfall als Startwert für einen Zufallsgenerator verwenden. Da per definitionem jede durch rein algorithmische Mittel erzeugte Zahl nicht wirklich zufällig sein kann.


6
2017-07-22 15:40



Ich verwende den folgenden Code, um eine Zufallszahl zu haben:

var random = new Random((int)DateTime.Now.Ticks);
var randomValue = random.Next(startValue, endValue + 1);

6
2017-10-14 14:38