C / C ++ - Code Der Kerncode besteht nur aus einer Zeile!
static unsigned int gi = 0;
int rand7()
{
return (((rand() % 5 + 1) + (gi++ % 7)) % 7) + 1;
}
//call this seed before rand7
//maybe it's not best seed, if yo have any good idea tell me please
//and thanks JiminP again, he remind me to do this
void srand7()
{
int i, n = time(0);
for (i = 0; i < n % 7; i++)
rand7();
}
Das srand7 () ist der Same von rand7, muss diese Funktion vor rand7 aufrufen, genauso wie das Aufrufen von srand vor rand in C.
Dies ist eine sehr gute Methode, da sie rand () nur einmal aufruft und keine Schleife, keine zusätzlichen Speicher benötigt.
Lassen Sie es mich erklären: Betrachten Sie ein ganzzahliges Array mit der Größe 5:
1st get one number from 1 2 3 4 5 by rand5
2nd get one number from 2 3 4 5 6
3rd get one number from 3 4 5 6 7
4th get one number from 4 5 6 7 1
5th get one number from 5 6 7 1 2
5th get one number from 6 7 1 2 3
7th get one number from 7 1 2 3 4
Also haben wir die TABELLE, jede von 1-7 erscheint fünfmal darin und hat alle 35 Zahlen, also ist die Wahrscheinlichkeit für jede Zahl 5/35 = 1/7. Und das nächste Mal,
8th get one number from 1 2 3 4 5
9th get one number from 2 3 4 5 6
......
Nach einiger Zeit können wir die gleichmäßige Verteilung von 1-7 erhalten.
Also können wir ein Array zuweisen, um die fünf Elemente von 1-7 durch Verschieben von links nach links wiederherzustellen, und jedes Mal eine Zahl von dem Array von rand5 erhalten. Stattdessen können wir alle sieben Arrays zuvor generieren und sie zirkulär verwenden. Der Code ist auch einfach, hat viele Kurzcodes, die das können.
Wir können jedoch die Eigenschaften von% operation verwenden, sodass die Zeilen in Tabelle 1-7 (rand5 + i)% 7 entsprechen, dh: a = rand ()% 5 + 1 ist rand5 in C-Sprache, b = gi ++ % 7 erzeugt alle Permutationen in der obigen Tabelle und 0 - 6 ersetzen 1 - 7 c = (a + b)% 7 + 1, erzeugt 1 - 7 gleichmäßig. Endlich haben wir diesen Code:
(((rand() % 5 + 1) + (gi++ % 7)) % 7) + 1
Wir können jedoch beim ersten Aufruf nicht 6 und 7 erhalten, daher benötigen wir einen Startwert, z. B. srand für rand in C / C ++, um die Permutation für den ersten formalen Aufruf zu ändern.
Hier ist der vollständige Code zum Testen:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
static unsigned int gi = 0;
//a = rand() % 5 + 1 is rand5 in C language,
//b = gi++ % 7 generates all permutations,
//c = (a + b) % 7 + 1, generates 1 - 7 uniformly.
//Dont forget call srand7 before rand7
int rand7()
{
return (((rand() % 5 + 1) + (gi++ % 7)) % 7) + 1;
}
//call this seed before rand7
//maybe it's not best seed, if yo have any good idea tell me please
//and thanks JiminP again, he remind me to do this
void srand7()
{
int i, n = time(0);
for (i = 0; i < n % 7; i++)
rand7();
}
void main(void)
{
unsigned int result[10] = {0};
int k;
srand((unsigned int)time(0)); //initialize the seed for rand
srand7() //initialize the rand7
for (k = 0; k < 100000; k++)
result[rand7() - 1]++;
for (k = 0; k < 7; k++)
printf("%d : %.05f\n", k + 1, (float)result[k]/100000);
}