843 Stimmen

Zufallszahlengenerator erzeugt nur eine Zufallszahl

Ich habe die folgende Funktion:

//Function to get random number
public static int RandomNumber(int min, int max)
{
    Random random = new Random();
    return random.Next(min, max);
}

Wie ich es nenne:

byte[] mac = new byte[6];
for (int x = 0; x < 6; ++x)
    mac[x] = (byte)(Misc.RandomNumber((int)0xFFFF, (int)0xFFFFFF) % 256);

Wenn ich diese Schleife mit dem Debugger während der Laufzeit durchlaufe, erhalte ich andere Werte (was ich ja auch will). Wenn ich jedoch zwei Zeilen unterhalb dieses Codes einen Haltepunkt setze, werden alle Mitglieder der mac Array haben den gleichen Wert.

Warum ist das so?

27 Stimmen

Mit new Random().Next((int)0xFFFF, (int)0xFFFFFF) % 256); ergibt keine besseren "Zufallszahlen" als .Next(0, 256)

2 Stimmen

Sie finden vielleicht dieses NuGet-Paket hilfreich. Es bietet eine statische Rand.Next(int, int) Methode, die einen statischen Zugriff auf Zufallswerte ermöglicht, ohne Sperren oder das Problem der Wiederverwendung von Seeds zu verursachen

-2voto

SZL Punkte 639

In Visual Basic funktioniert dies (wahrscheinlich kann in C# übersetzt werden, wenn nicht eine DLL-Referenz kann eine Lösung sein):

Private Function GetRandomInt(ByVal Min As Integer, ByVal Max As Integer) As Integer
     Static Generator As System.Random = New System.Random()
     Return Generator.Next(Min, Max)
End Function

-3voto

Marztres Punkte 430

Es gibt eine Menge von Lösungen, hier eine: wenn Sie nur Zahl wollen, löschen Sie die Buchstaben und die Methode erhält eine zufällige und das Ergebnis Länge.

public String GenerateRandom(Random oRandom, int iLongitudPin)
{
    String sCharacters = "123456789ABCDEFGHIJKLMNPQRSTUVWXYZ123456789";
    int iLength = sCharacters.Length;
    char cCharacter;
    int iLongitudNuevaCadena = iLongitudPin; 
    String sRandomResult = "";
    for (int i = 0; i < iLongitudNuevaCadena; i++)
    {
        cCharacter = sCharacters[oRandom.Next(iLength)];
        sRandomResult += cCharacter.ToString();
    }
    return (sRandomResult);
}

1 Stimmen

Das Grundproblem ist immer noch dasselbe - Sie übergeben eine Random Instanz, aber Sie erwarten immer noch, dass der Aufrufer eine gemeinsame Instanz erstellt. Wenn der Aufrufer jedes Mal eine neue Instanz erstellt und der Code zweimal ausgeführt wird, bevor sich die Uhr ändert, erhalten Sie dieselbe Zufallszahl. Diese Antwort geht also immer noch von Annahmen aus, die fehlerhaft sein könnten.

0 Stimmen

Außerdem ist der Sinn einer Methode zur Erzeugung von Zufallszahlen die Kapselung - die aufrufende Methode muss sich nicht um die Implementierung kümmern, sie ist nur daran interessiert, eine Zufallszahl zurückzubekommen.

-5voto

Erhalten Sie immer eine positive Zufallszahl.

 var nexnumber = Guid.NewGuid().GetHashCode();
        if (nexnumber < 0)
        {
            nexnumber *= -1;
        }

0 Stimmen

Dieser Code verwendet nicht das Random-Objekt, wie aus der Frage hervorgeht, und GUIDs zielen nicht darauf ab, technisch zufällig zu sein (wie oben erwähnt).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X