der Schnellste Weg zur Erzeugung von zufälligen bits
Was wäre der Schnellste Weg, um erzeugen eine große Anzahl von (pseudo-)zufällige bits. Jedes bit unabhängig sein müssen, und null oder eins mit gleicher Wahrscheinlichkeit auf. Ich könnte natürlich einige Variationen auf
randbit=rand()%2;
aber ich fühle mich wie es sollte eine Methode, die schneller, erzeugen einige zufällige bits von jedem Aufruf des Zufallszahlengenerators. Im Idealfall würde ich mag, um ein int oder ein char ist, bei dem jedes bit ist zufällig und unabhängig ist, aber andere Lösungen sind auch möglich.
Die Anwendung ist nicht kryptographische in der Natur so starke Zufälligkeit ist nicht ein wichtiger Faktor ist, in der Erwägung, dass die Geschwindigkeit und die richtige Verteilung ist wichtig.
- Welche distribution Sie suchen? Und wie wählerisch sind Sie in Bezug auf die Richtigkeit der Verteilung. Wenn Sie wirklich wollen, P[x] = 1/n für die zahlen x im Intervall [1..n], dann müssen Sie noch einen guten rng-auch wenn Ihre Anwendung nicht crypto.
- Was über so etwas wie
((int)rand*rand)%2
? - Vielleicht ein Duplikat der stackoverflow.com/questions/25176423/... (diese Frage ist mehr breit als er fragt auch, über nicht bei 50:50-Distributionen)
Du musst angemeldet sein, um einen Kommentar abzugeben.
konvertieren eine zufällige Zahl in Binär
Warum Holen Sie sich nicht nur eine Zahl (mit der passenden Größe, um genug bits, die Sie brauchen) und dann konvertieren Sie es in binäre. Werden Sie tatsächlich bit aus einer zufälligen Zahl, die bedeutet, Sie sind willkürlich.
Nullen und Einsen haben auch die Wahrscheinlichkeit von 50%, denn alle zahlen zwischen 0 und 2^n-Grenze und zählen die Anzahl der Nullen und Einsen gleich sind > was bedeutet, dass die Wahrscheinlichkeit von Nullen und Einsen ist gleich.
hinsichtlich der Geschwindigkeit
das wäre wahrscheinlich sehr schnell, da immer nur eine zufällige Zahl im Vergleich zur Anzahl der bits in es ist schneller. es rein hängt davon ab, Ihre binäre Konvertierung jetzt.
for ( i = 0; i < sizeof( randomNumber ) * 8; ++i ) { std::cout << ( randomNumber & 1U ); randimNumber >>= 1U; }
vorausgesetzt randomNumber. ist eine vorzeichenlose Ganzzahl.Werfen Sie einen Blick auf Boost.Random, vor allem
boost::uniform_int<>
.Wie Sie sagen, einfach erzeugen zufällige ganze zahlen.
Dann haben Sie 32 zufällige bits mit Einsen und Nullen gleich wahrscheinlich sind.
Holen Sie sich die bits in einer Schleife:
Wiederholen Sie diesen Schritt für wie viele Male Sie brauchen, um zu erhalten die richtige Menge an bits.
Hier ist eine sehr schnelle ein-ich codiert in Java basierend auf George Marsaglia ist XORShift-Algorithmus: bekommt man 64 bits zu einer Zeit!
SMP-Sicher (d.h. Schnellste Weg, possiable in diesen Tagen) und gute bits
Beachten Sie die Verwendung der [ThreadStatic] - Attribut, so wird dieses Objekt automatisch Griff ist der neue thread, keine sperren. Das ist der einzige Weg, Sie gehen, um zu gewährleisten, high-performance-random, SMP lockfree.
http://blogs.msdn.com/pfxteam/archive/2009/02/19/9434171.aspx
Dieser nahm 4.5886 e-05s bei meinem test mit 256 bit.
bernoulli_distribution
wäre noch besser gewesen, einfacher, schneller, und vieles mehr richtig!!!!std::bernoulli_distribution bdist(0.5); for(size_t i = 0; i < nrOfBits; i++) randomBits.set(i, bdist(generator));
Können Sie sich eine Zufallszahl erzeugen und halten auf der rechten shifitng und Test der least significant bit, um die zufällige bits zu tun, anstatt eine mod-operation.
Wenn ich erinnern, richtig, die am wenigsten signifikanten bits sind normalerweise mit einem "weniger zufällig"
die Verteilung für die meisten pseuodo Zufallszahlen-Generatoren, so dass die Verwendung von modulo und/oder jedes bit in die generierte Zahl wäre schlimm, wenn Sie sind besorgt über die Verteilung.
(Vielleicht sollte man wenigstens google, was Knuth sagt...)
Wenn das hält ( und das ist schwer zu sagen, ohne genau zu wissen, welchen Algorithmus Sie verwenden) verwenden nur das höchste bit in jede generierte Zahl ist.
http://en.wikipedia.org/wiki/Pseudo-random
Wie groß brauchst du die Anzahl der erzeugten bits werden? Wenn es nicht größer als ein paar Millionen, und im Kopf behalten, dass Sie nicht über den generator für Kryptographie, dann denke ich der Schnellste Weg wäre precompute eine große Menge der ganzen zahlen mit der richtigen Verteilung, konvertieren Sie es in eine text-Datei wie folgt:
- und kompilieren Sie dann das array in Ihrem Programm und durch die es eine Zahl zu einem Zeitpunkt.
So erhalten Sie 32 bits, die mit jedem Aufruf (auf einem 32-bit-Prozessor), die Generationszeit ist die kürzeste, weil alle zahlen, die generiert werden, im Voraus, und die Verteilung wird von Ihnen kontrolliert. Der Nachteil ist natürlich, dass diese zahlen nicht zufällig sind, was je nachdem, was Sie mit dem PRNG für möglicherweise oder möglicherweise keine Rolle.
wenn Sie nur ein wenig in einer Zeit versuchen
bool coinToss()
Es technisch ein schneller Weg zur Erzeugung von bits, da der Austausch der %2 &1, die gleichwertig sind.{
return rand()&1;
}
Gerade gelesen, einige Speicher - nehmen Sie ein n-bit-Abschnitt von raw-Speicher. Es wird ziemlich random.
Alternativ, erzeugen eine große zufällige int x und verwenden nur die bit-Werte.