Ich gehe davon aus, dass Sie eine Zufallszahl im Bereich wollen [0, 1000000 [, die in einem Bereich liegt, Länge von 10 .
Es ist genau das gleiche wie die Auswahl von zwei Zufallszahlen im Bereich [0, 1000 [, einer für die höherwertigen (dezimalen) Ziffern, einer für die niedrigwertigen. Aber es ist viel einfacher, in diesem Bereich zu arbeiten ...
Wenn Sie eine korrekte Zufallsgenerierung wünschen, sollten Sie sich um die Wahrscheinlichkeit jeder möglichen Zahl kümmern und versuchen, sie so gleich wie möglich zu halten. Sie müssen also zuerst die größte Potenz von 1000 unterhalb von RAND_MAX suchen, alle Zahlen, die größer als diese sind, ablehnen und den Modul 1000 von jedem gehaltenen Wert nehmen.
// Find the max number to keep
int period = 1000
unsigned int max = period;
while (max < (unsigned long) RAND_MAX) {
unsigned long t = max * period;
if (t < max) break; // test for a possible overflow
max = t;
}
Sie können dann
for(;;) {
unsigned long randnum = rand();
if (randnum < max) {
randnum %= period;
break;
}
}
verwenden Und wenn Sie zwei Zufallszahl in Bereich [0, 1000 [, sagen n1
und n2
, tun gerade:
n = period * n1 + n2;
Natürlich gehen Sie davon aus, dass Sie eine korrekte rand
Funktion haben. Falls Sie nicht sicher Verwendung random
-rand
Manpage auf meinem System besagt, verwendet es gleiche algorythm wie random
, deshalb nehme ich an ich es sicher verwenden können, aber es sagt auch:
jedoch auf älteren rand() Implementierungen und auf Bei aktuellen Implementierungen auf verschiedenen Systemen sind die Bits niedrigerer Ordnung viel weniger zufällig als die Bits höherer Ordnung.Verwenden Sie diese Funktion nicht in Anwendungen, die portabel sein sollen, wenn eine gute Zufälligkeit erforderlich ist. (Verwenden Sie stattdessen random (3).)
"max" sollte wahrscheinlich auch ein "unsigned long" sein, oder? – Kundor