it-swarm.com.de

Wie erstelle ich eine zufällige Ganzzahl?

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

1740
Rella

Die Random class wird verwendet, um Zufallszahlen zu erstellen. (Das ist natürlich Pseudozufall.).

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 Instanz Random beibehalten und wiederverwenden. Wenn Sie neue Instanzen zu zeitnah erstellen, werden dieselben Zufallszahlen erzeugt wie der Zufallsgenerator aus der Systemuhr.

2281
Guffa

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

Dazu müssen wir zuerst den Begriff ZUFÄLLIGKEIT und die dahinter stehende Philosophie verstehen.

Ich möchte Sie ermutigen, dieses Video anzusehen, das die Philosophie der ZUFÄLLIGKEIT mit C # vertieft. Https://www.youtube.com/watch?v=tCYxc-2-3fY

Lassen Sie uns als erstes die Philosophie der ZUFÄLLIGKEIT verstehen. Wenn wir einer Person sagen, sie soll zwischen ROT, GRÜN und GELB wählen, was intern geschieht. Warum wählt eine Person ROT, GELB oder GRÜN?

c# Random

Einige anfängliche Gedanken gehen in den Verstand der Person, der seine Wahl entscheidet, es kann Lieblingsfarbe, Glücksfarbe und so weiter sein. Mit anderen Worten, ein initialer Trigger, den wir in RANDOM als SEED bezeichnen. Dieser SEED ist der Anfangspunkt, der ihn veranlasst, den RANDOM-Wert auszuwählen.

Wenn ein SEED leicht zu erraten ist, werden diese Arten von Zufallszahlen als PSEUDO bezeichnet, und wenn es schwierig ist, einen Samen zu erraten, sind diese Zufallszahlen bezeichnete GESICHERTE Zufallszahlen.

Zum Beispiel wählt eine Person eine Farbe, die von der Wetter- und Klangkombination abhängt, dann ist es schwierig, den anfänglichen Samen zu erraten.

c# Random

Lassen Sie mich nun eine wichtige Erklärung abgeben:

* Die "Random" -Klasse generiert nur eine PSEUDO-Zufallszahl. Um eine SECURE-Zufallszahl zu generieren, müssen Sie die "RNGCryptoServiceProvider" -Klasse verwenden.

c# Random

Die Zufallsklasse entnimmt der CPU-Uhr Startwerte, die sehr gut vorhersehbar sind. Mit anderen Worten, die RANDOM-Klasse von C # erzeugt Pseudozufallszahlen. Unten ist der Code für dieselbe.

var random = new Random();
int randomnumber = random.Next()

Während die RNGCryptoServiceProvider-Klasse die Betriebssystementropie verwendet, um Startwerte zu generieren. Die OS-Entropie ist ein zufälliger Wert, der unter Verwendung von Sound, Mausklick- und Tastatur-Timings, thermischer Temperatur usw. erzeugt wird. Nachfolgend finden Sie den Code für denselben Wert.

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

Um die Entropie des Betriebssystems zu verstehen, sehen Sie sich dieses Video ab 14:30 https://www.youtube.com/watch?v=tCYxc-2-3fY an, in dem die Logik der Entropie des Betriebssystems erklärt wird . Mit einfachen Worten generiert RNG Crypto also SICHERE Zufallszahlen.

219

Jedes Mal, wenn Sie Random () neu machen, wird es initialisiert. Dies bedeutet, dass Sie in einer engen Schleife häufig den gleichen Wert erhalten. Sie sollten eine einzelne Zufallsinstanz 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);
    }
}
213
Pankaj Mishra

Beachten Sie, dass new Random() auf den aktuellen Zeitstempel gesetzt ist.

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

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

Weitere Informationen finden Sie in der Random -Klasse. Beachten Sie jedoch Folgendes:

Da die Uhr jedoch eine endliche Auflösung hat, werden durch die Verwendung des parameterlosen Konstruktors zum Erstellen verschiedener Zufallsobjekte in enger Folge Zufallszahlengeneratoren erstellt, die identische Folgen von Zufallszahlen erzeugen

Verwenden Sie diesen Code also nicht, um eine Reihe von Zufallszahlen zu generieren.

85
Fyodor Soikin
Random r = new Random();
int n = r.Next();
46
Joren

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);
}
27
joordan831

Sie können Jon Skeets StaticRandom -Methode in der MiscUtil-Klassenbibliothek verwenden, die er für eine Pseudozufallszahl erstellt hat.

using MiscUtil;
...

for (int i = 0; i < 100; 
    Console.WriteLine(StaticRandom.Next());
16
mbcrump

es ist besser, das Random-Objekt mit aktuellen Millisekunden zu sortieren, um eine echte Zufallszahl sicherzustellen, und Sie werden fast keine Duplikate finden, die es oft verwenden

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

pdate

Ich weiß, dass new Random() die aktuellen Ticks als Seed verwendet, aber das Seeding mit aktuellen Millisekunden ist immer noch gut genug, da es ein guter Zufallsstart ist

Der letzte verbleibende Punkt ist, dass Sie nicht jedes Mal, wenn Sie eine Zufallszahl benötigen, new Random() initialisieren müssen. Initiieren Sie ein Zufallsobjekt und verwenden Sie es dann so oft, wie Sie es in einer Schleife oder was auch immer benötigen

14
Mohamed Selim

Ich habe alle diese Lösungen mit Ausnahme der COBOL-Antwort ausprobiert ... lol

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

Es geht nur um den Samen.

Ich erstelle eine zufällige Ganzzahl, indem ich die Nicht-Ziffern aus Guid analysiere. Dann benutze ich diese, um meine Zufallsklasse zu instanziieren.

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);
}

pdate: Seeding ist nicht erforderlich, wenn Sie die Random-Klasse einmal instanziieren. Es ist also am besten, eine statische Klasse zu erstellen und eine Methode daraus 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, dass mir dieser Ansatz besser gefällt.

13
Proximo

Die von der eingebauten Klasse Random (System.Random) generierten Zahlen erzeugen Pseudozufallszahlen.

Wenn Sie echte Zufallszahlen wollen, können wir am ehesten einen "sicheren Pseudo-Zufallsgenerator" erhalten, der mithilfe der kryptografischen Klassen in C # wie RNGCryptoServiceProvider generiert werden kann.

Wenn Sie dennoch true Zufallszahlen benötigen, müssen Sie eine externe Quelle verwenden, z. B. Geräte, die den radioaktiven Zerfall berücksichtigen, als Ausgangswert für einen Zufallszahlengenerator. Da per Definition jede Zahl, die mit rein algorithmischen Mitteln erzeugt wird, nicht wirklich zufällig sein kann.

9
Anshita Arya

Geänderte Antwort von hier .

Wenn Sie Zugriff auf eine Intel Secure Key-kompatible CPU haben, können Sie mit diesen Bibliotheken echte Zufallszahlen und Zeichenfolgen generieren: https://github.com/JebteK/RdRand und https://www.rdrand.com/

Laden Sie einfach die neueste Version von hier herunter, fügen Sie Jebtek.RdRand hinzu und fügen Sie eine using-Anweisung hinzu. Dann müssen Sie nur noch Folgendes tun:

// Check to see if this is a compatible CPU
bool isAvailable = RdRandom.GeneratorAvailable();

// Generate 10 random characters
string key       = RdRandom.GenerateKey(10);

 // Generate 64 random characters, useful for API keys 
string apiKey    = RdRandom.GenerateAPIKey();

// Generate an array of 10 random bytes
byte[] b         = RdRandom.GenerateBytes(10);

// Generate a random unsigned int
uint i           = RdRandom.GenerateUnsignedInt();

Wenn Sie keine kompatible CPU haben, auf der Sie den Code ausführen können, verwenden Sie einfach die RESTful-Dienste auf rdrand.com. Mit der RdRandom-Wrapper-Bibliothek, die in Ihrem Projekt enthalten ist, müssten Sie dies nur tun (Sie erhalten 1000 kostenlose Anrufe, wenn Sie sich anmelden):

string ret = Randomizer.GenerateKey(<length>, "<key>");
uint ret   = Randomizer.GenerateUInt("<key>");
byte[] ret = Randomizer.GenerateBytes(<length>, "<key>");
8
JebaDaHut

Ich benutze folgenden Code, um eine Zufallszahl zu haben:

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

Dies ist die Klasse, die ich benutze. Funktioniert wie RandomNumber.GenerateRandom(1, 666)

internal static class RandomNumber
{
    private static Random r = new Random();
    private static object l = new object();
    private static Random globalRandom = new Random();
    [ThreadStatic]
    private static Random localRandom;
    public static int GenerateNewRandom(int min, int max)
    {
        return new Random().Next(min, max);
    }
    public static int GenerateLockedRandom(int min, int max)
    {
        int result;
        lock (RandomNumber.l)
        {
            result = RandomNumber.r.Next(min, max);
        }
        return result;
    }
    public static int GenerateRandom(int min, int max)
    {
        Random random = RandomNumber.localRandom;
        if (random == null)
        {
            int seed;
            lock (RandomNumber.globalRandom)
            {
                seed = RandomNumber.globalRandom.Next();
            }
            random = (RandomNumber.localRandom = new Random(seed));
        }
        return random.Next(min, max);
    }
}
5
AskethZ
Random random = new Random ();
int randomNumber = random.Next (lowerBound,upperBound);
4
ReRoute

Für einen starken Zufallssamen verwende ich immer CryptoRNG und nicht Time.

using System;
using System.Security.Cryptography;

public class Program
{
    public static void Main()
    {
        var random = new Random(GetSeed());
        Console.WriteLine(random.Next());
    }

    public static int GetSeed() 
    {
        using (var rng = new RNGCryptoServiceProvider())
        {
            var intBytes = new byte[4];
            rng.GetBytes(intBytes);
            return BitConverter.ToInt32(intBytes, 0);
        }
    }
}
3
Davit Tvildiani

Während dies in Ordnung ist:

Random random = new Random();
int randomNumber = random.Next()

Sie möchten die Begrenzung (min und max mumbers) die meiste Zeit steuern. Sie müssen also angeben, wo die Zufallszahl beginnt und endet.

Die Methode Next() akzeptiert zwei Parameter, min und max.

Wenn ich also möchte, dass meine Zufallszahl zwischen 5 und 15 liegt, mache ich das einfach

int randomNumber = random.Next(5, 16)
3

Zahlen, die von einem Computer durch einen deterministischen Prozess berechnet werden, können per Definition nicht zufällig sein.

Wenn Sie echte Zufallszahlen wollen, kommt die Zufälligkeit von atmosphärischem Rauschen oder radioaktivem Zerfall.

Sie können zum Beispiel RANDOM.ORG versuchen (es reduziert die Leistung)

2
Stefano Lonati

Ich wollte zeigen, was passiert, wenn jedes Mal ein neuer Zufallsgenerator verwendet wird. Angenommen, Sie haben zwei Methoden oder zwei Klassen, für die jeweils eine Zufallszahl erforderlich ist. Und naiv codieren Sie sie wie folgt:

public class A
{
    public A()
    {
        var rnd=new Random();
        ID=rnd.Next();
    }
    public int ID { get; private set; }
}
public class B
{
    public B()
    {
        var rnd=new Random();
        ID=rnd.Next();
    }
    public int ID { get; private set; }
}

Glaubst du, du wirst zwei verschiedene Ausweise bekommen? NEIN

class Program
{
    static void Main(string[] args)
    {
        A a=new A();
        B b=new B();

        int ida=a.ID, idb=b.ID;
        // ida = 1452879101
        // idb = 1452879101
    }
}

Die Lösung besteht darin, immer einen einzelnen statischen Zufallsgenerator zu verwenden. So was:

public static class Utils
{
    public static readonly Random random=new Random();
}

public class A
{
    public A()
    {
        ID=Utils.random.Next();
    }
    public int ID { get; private set; }
}
public class B
{
    public B()
    {
        ID=Utils.random.Next();
    }
    public int ID { get; private set; }
}
2
ja72
Random Rand = new Random();
int name = Rand.Next()

Geben Sie die gewünschten Werte in die zweiten Klammern ein und vergewissern Sie sich, dass Sie einen Namen festgelegt haben, indem Sie prop und double tab schreiben, um den Code zu generieren

2
user3773367

Sie können es mit dem folgenden zufälligen Startwert versuchen:

var rnd = new Random(11111111); //note: seed value is 11111111

string randomDigits = rnd.Next();

var requestNumber = $"SD-{randomDigits}";
0
Rejwanul Reja

Entschuldigung, OP erfordert in der Tat einen zufälligen int Wert, aber für den einfachen Zweck, Wissen zu teilen, wenn Sie einen zufälligen BigInteger Wert wollen, können Sie folgende Anweisung verwenden:

BigInteger randomVal = BigInteger.Abs(BigInteger.Parse(Guid.NewGuid().ToString().Replace("-",""), NumberStyles.AllowHexSpecifier));
0
Ciro Corvino

Der einfachste Weg ist wahrscheinlich nur Random.range(1, 3) Dies würde eine Zahl zwischen 1 und 2 erzeugen.

0
Gustav Petersen

Ich gehe davon aus, dass Sie einen gleichmäßig verteilten Zufallszahlengenerator wie unten wollen. Zufallszahlen in den meisten Programmiersprachen, einschließlich C # und C++, werden vor der Verwendung nicht ordnungsgemäß gemischt. Dies bedeutet, dass Sie immer wieder die gleiche Zahl erhalten, was nicht wirklich zufällig ist. Um zu vermeiden, dass dieselbe Zahl immer wieder gezogen wird, benötigen Sie einen Startwert. In der Regel ist ein rechtzeitiger Tick für diese Aufgabe in Ordnung. Denken Sie daran, dass Sie immer wieder die gleiche Zahl erhalten, wenn Sie jedes Mal den gleichen Samen verwenden. Versuchen Sie also, immer wechselndes Saatgut zu verwenden. Zeit ist eine gute Quelle für Saatgut, weil sie immer chagen.

int GetRandomNumber(int min, int max)
{
    Random Rand = new Random((int)DateTime.Now.Ticks);
    return Rand.Next(min, max);
}

wenn Sie einen Zufallszahlengenerator für die Normalverteilung suchen, können Sie eine Box-Muller-Transformation verwenden. Überprüfen Sie die Antwort von yoyoyoyosef in Random Gaussian Variable Question. Da Sie eine Ganzzahl wollen, müssen Sie am Ende einen doppelten Wert in eine Ganzzahl umwandeln.

Random Rand = new Random(); //reuse this if you are generating many
double u1 = 1.0-Rand.NextDouble(); //uniform(0,1] random doubles
double u2 = 1.0-Rand.NextDouble();
double randStdNormal = Math.Sqrt(-2.0 * Math.Log(u1)) *
         Math.Sin(2.0 * Math.PI * u2); //random normal(0,1)
double randNormal =
         mean + stdDev * randStdNormal; //random normal(mean,stdDev^2)

Zufällige Gaußsche Variablen

0
auto9817