Algorithmus für Math.Random [geschlossen]

8

Dies war die Frage eines Interviewers. Ich konnte nicht antworten.

Die Frage war, dass Sie eine Zufallszahl aus dem angegebenen Array auswählen möchten.

  

Bedingung ist, dass Sie nichts in sequentiellen und wählen sollten   die eingebaute Zufallsfunktion nicht zu verwenden.

Ich habe keine Ahnung. Wie zu wissen, wie ist das Math.Random für uns?

Ich habe gegoogelt und die Implementierung / Logik dahinter nicht gefunden.

Jeder weiß es?

    
Billa 21.03.2013, 15:30
quelle

8 Antworten

22

Bis jetzt haben drei Leute dir gesagt, du sollst die letzte Ziffer von Ticks benutzen. Das funktioniert nicht. Versuchen Sie es in einer engen Schleife und Sie werden schnell sehen, warum es eine schlechte Idee ist.

Die Frage ist nicht sehr gut gestellt. Ich mag es, in Interviews mehrdeutig gestellte Fragen zu stellen, weil man herausfinden muss, wie der Kandidat mit einer mehrdeutigen Situation umgeht. In diesem Fall würde ich sofort zurückschieben und herausfinden, was der Interviewer mit "zufällig" meint. Ist Pseudozufälligkeit gut genug? Gibt es eine Quelle für qualitativ hochwertige Entropie?

Sobald Sie eine geklärte Frage haben, sollte es einfacher sein zu antworten.

Das Problem liegt in der Verwaltung der Entropie. Wenn Sie eine sehr schwache Quelle der Entropie haben - wie der Wert von Ticks (nicht die letzte Ziffer, die wertlos ist, sondern den gesamten Wert), dann können Sie damit einen Pseudozufallszahlengenerator erzeugen. Wenn Sie eine hochqualitative Entropiequelle haben, können Sie damit einfach Zufallsbits erzeugen.

    
Eric Lippert 21.03.2013 15:47
quelle
7

Garantiert zufällig zu sein. (Zunge FIRMLY in Wange):

%Vor%     
JerKimball 21.03.2013 16:10
quelle
5

Wenn Sie nur ein Element aus einem Array abrufen möchten, ohne die Klasse Random zu verwenden, können Sie eine Funktion modulo mit einem unbekannten Wert wie DateTime.Now.Ticks : %Vor%     

ken2k 21.03.2013 15:35
quelle
4

Ich würde das

verwenden %Vor%

Und wenn ich gerade genug Zahlen für Math.Random (10) nehme, nehme ich nur die letzten zwei Zahlen.

Oder Sie können den Modulo dieses Ticks wie folgt nehmen:

%Vor%

siehe folgenden Test:

%Vor%     
Thomas 21.03.2013 15:34
quelle
1

Hier ist eine Implementierung von Zufallszahlen in C. Sie könnten versuchen, sie in C # umzuschreiben.

Zufallszahlen für C: Endlich, endlich? Ссылка

Es scheint von sehr hoher Qualität zu sein.

Aber diesen Code in einem Interview zu schreiben ist nicht einfach, aber man könnte ihm definitiv die Ideen sagen.

    
jacob aloysious 21.03.2013 15:37
quelle
0

Nur eine Idee: Sie könnten eine der letzten Ziffern in DateTime.Now.Ticks verwenden, um eine Basis für die Auswahl des Index zu erhalten. Oder vielleicht eine Hash-Funktion für dieselbe Sache. Oder verwenden Sie einen Webservice, der Ihnen Zufallszahlen aus der Strahlung geben kann. Math.Random wählt nur aus vordefinierten Tabellen (ja, es ist nicht wirklich zufällig).

    
David S. 21.03.2013 15:35
quelle
0

Ich glaube, sie haben nur gesehen, ob Sie von LCG-Algorithmen (Linear Congruential Generator) wussten.

Die Mathematik hinter ihnen ist jedoch etwas schwierig, also bezweifle ich, dass sie erwarten können, dass du in der Lage bist, einen von deinem Kopf zu schreiben.

Aber scheitern Sie das, könnten Sie nicht einfach so schummeln, um einen zufälligen Index zu erzeugen?

int index = Guid.NewGuid().GetHashCode() % array.Length;

    
Matthew Watson 21.03.2013 15:39
quelle
0

Erstens ist es bekannt als Pseudo-Random und nicht nur als Random, da Random-Reihen unmöglich in einer Computer-Form erzeugt werden können,

Die meisten Pseudo-Zufallszahlen-Generatoren PRNG haben folgende Form:

zur Zeit 0: R (0) = Random (Seed)

zur Zeit i: R (i) = Zufall (R (i-1));

Zweitens bedeutet Random nicht, dass Sie nicht wissen, was das i-te Ergebnis sein wird, aber dass die Serie robust ist & amp; Es ist sehr schwierig, die Formel oder die vorgegebene Kette von Ergebnissen zu erraten

Hoffe, das hilft

    
Khaled.K 21.03.2013 16:12
quelle

Tags und Links