Ich möchte Zufallszahlen im Bereich von 0 bis 2^10 generieren. Ich habe gehört, dass rand()
Funktion für diese vielen Zahlen nicht geeignet ist. Gibt es eine andere Möglichkeit, es mit fast gleicher Verteilung zu generieren?Generierung Zufallszahl von 2^30
Antwort
g_random_int() gibt ein zufälliges guint32 gleichmäßig über den Bereich [0..2^32-1] verteilt.
#include <glib.h>
int
main(void)
{
g_print("%d\n", g_random_int());
return 0;
}
mit gcc:
gcc -o rand rand.c `pkg-config --cflags --libs glib-2.0`
EDIT:
Lesen direkt von/dev/random (weniger tragbar), Kompilieren wie üblich:
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
int
main(void)
{
int fd;
unsigned int number;
fd = open("/dev/random", O_RDONLY);
read(fd, &number, sizeof(number));
printf("%u\n", number);
close(fd);
return 0;
}
PS: Auf Fehler prüfen.
rand.c ist meine Datei, in der ich diesen Code gespeichert habe (Entschuldigung, ich habe sehr wenig Wissen über Compiler) – john
@jhon Wenn Sie nur Zufallszahlen zwischen 0 und 2^32 wollen dann lesen Sie einfach aus/dev/random es wird Ihnen Zufälligkeit selbst: P versuchen Sie dies in Ihrer Shell: 'od -An -N4 -tu/dev zufällig | tr -d '' ' umleiten zu einer Datei ' od -An-N4 -tu/dev/random | tr -d ''> file.txt' aber ja; Wenn Sie den obigen Code kopieren und in eine Datei mit dem Namen rand.c einfügen, können Sie ihn sogar kompilieren, indem Sie einfach den obigen Befehl eingeben. Beachten Sie, dass der Code eine Anforderung hat. Sie müssen Glib in Ihrem System installiert haben. Natürlich funktioniert nichts davon, wenn Sie Linux nicht verwenden. – yeyo
ok danke mit dem Shell-Befehl Ich bin in der Lage zu tun.Aber wenn ich es für die Datei rand.c mit obigen Befehl tat es mit Symbol >> aufgeklebt. – john
Mark A. Overton hatte einen netten Artikel auf recht einfache, aber qualitativ hochwertige RNGs auf Dr. Dobbs am 24. Mai 2011
In Java können Sie Zufalls verwenden, die nach 2^48 Werte wiederholt sich.
Random rand = new Random();
for(int i = 0; i < (1<<30); i++) {
int n = rand.nextInt(1 << 10);
}
Die C++ <random>
Bibliothek ist eine ausgezeichnete Wahl, mit vielen Möglichkeiten von PRNG Motor und Verteilung.
#include <random>
#include <cstdint>
#include <iostream>
int main() {
std::random_device r;
std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
std::mt19937_64 eng(seed);
std::uniform_int_distribution<> dist(0, 1<<10);
for (std::uint32_t i = 0; i< (1<<30); ++i) {
int value = dist(eng);
std::cout << value << ' ';
}
}
Auch random_device ist selbst ein Motor, der kann, abhängig von der Implementierung, den Zugang zu einem nicht-deterministisch oder Verschlüsselungs RNG bieten:
std::random_device eng;
std::cout << dist(eng) << '\n';
Zum Beispiel in libC++ verwendet es/dev/urandom Standardmäßig verwendet OS X den Yarrow-Verschlüsselungs-RNG-Algorithmus.
es gibt Fehler wie: 'mt19937_64' ist kein Mitglied von 'Std' – john
Welche Compiler/Bibliothek und Versionen verwenden Sie? Vielleicht hat es das noch nicht implementiert. Sie könnten auch 'std :: mt19937' oder einen der anderen [vordefinierten Zufallsgeneratoren] (http://en.cppreference.com/w/cpp/numeric/random) ausprobieren. – bames53
es zeigt GCC Version 4.6.3 – john
Ein einfacher Weg, die Zufälligkeit und Periode zu inkrementieren:
public class Random2 {
private static int LEN = 64;
private final int[] buf = new int[LEN];
private Random r;
private final int maxInt = 1 << 10;
public Random2() {
r = new Random();
for (int i = 0; i < LEN; i++)
buf[i] = r.nextInt(maxInt);
}
public int nextInt() {
int i = r.nextInt(LEN);
int x = buf[i];
buf[i] = r.nextInt(maxInt);
return x;
}
}
Hier ist ein alter Usenet-Post mit einer Reihe von interessanten RNGs - alles sehr einfach zu implementieren.
http://www.cse.yorku.ca/~oz/marsaglia-rng.html
Sie können nicht ganz die Mersenne-Twister passen, aber ich habe gute Verwendung von mehreren von ihnen gemacht und sie sind sicherlich überlegen einige der Standard-rand() Implementierungen. Sie bestehen die DIEHARD Tests der Zufälligkeit und der größte Periodengenerator hat eine Periode von> 2^7700 und benötigt nicht mehr als ein paar Zeilen zum Implementieren.
Ken
- 1. Generierung von Zufallszahl als Benutzerkennung
- 2. Generierung von Zufallszahl in Bereich in julia
- 3. Wie rechenintensiv ist die Generierung einer Zufallszahl in C++?
- 4. Generierung einer Zufallszahl von 0 bis 9 basierend auf einer Reihe von Münzwürfen
- 5. Zufallszahl von divs mit Zufallszahl von Elementen mit PHP
- 6. Generierung von Zufallszahlen in jeder Zeile in Oracle Abfrage
- 7. Zufallszahl Auswahl
- 8. Schema Generierung von HSQL
- 9. Yii2 Generierung von Übersetzungsnachrichten
- 10. Generierung von zufälligen enums
- 11. Generierung von Seriennummern
- 12. Generierung von F # -Code
- 13. Was ist ein Seed in Bezug auf die Generierung einer Zufallszahl?
- 14. Javascript Zufallszahl?
- 15. Zufallszahl Spiel
- 16. Zufallszahl generieren
- 17. Codeval Challenge 230: Fußball, Antwort nur teilweise korrekt
- 18. Boost :: Test - Generierung von Main()?
- 19. Groovy @Grab Generierung von java.lang.NoClassDefFoundError
- 20. Generierung von Comma Separated Values
- 21. Probabilistische Generierung von Semantischen Netzwerken
- 22. Generierung von PMML in WEKA
- 23. sqlite3 UPDATE Generierung von Nullen
- 24. Dynamische Generierung von .doc-Dateien
- 25. Gemeinsame URL-Generierung von uuid4?
- 26. bind(): Keine solche Datei oder Verzeichnis [core/socket.c Zeile 230]
- 27. Zufallszahl mit Samen
- 28. Zufallszahl in iphone sdk?
- 29. Zufallszahl innerhalb regelmäßigen Polygon
- 30. C++ Zufallszahl 1-9
Schauen Sie in C++ 11 '' 'Header. –
chris
Und in C++ 03, Boost.Random (wo '' herkam). –
GManNickG
Gibt es kein Problem mit der Generierung großer Zufallszahlen mit gleichmäßiger Verteilung? – andre