所以试图找出C中rand()mod k7有什么特别之处。在另一篇文章中有人说C rand()使用http://en.wikipedia.org/wiki/Linear_congruential_generator但是我不知道是什么造成的(mod k7) K->与ANSI C相关的算法的标量特殊。
所以我有以下代码:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
void getRand(int* num1, int* num2, int* num3);
int main(int argc, const char * argv[])
{
int i = 0;
for (i = 0; i < 100; i++) {
srand(time(NULL));
printf("%d\n", rand() % 7 );
sleep(1);
}
return 0;
}
这总是打印3.但是如果我使用任何n使7不分n,我会得到更好的第一个值序列。仍然显然不是随机但更好的只有3或一些c mod 7 = 3.
我故意用循环中的种子以这种方式制作程序,以表明无论种子如何,第一个值总是返回3。
是的我可以获得Xn n > 0
的随机数字,但我希望每个Xo都有X1 % 7 != X1 % 7
。
答案 0 :(得分:2)
好的,让我们先看一下不仅仅是几个数据点:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(int argc, const char * argv[])
{
size_t counters[7] = {0,0,0,0,0,0,0};
time_t tt = time(NULL);
//for (size_t i = 0; i < 7; i++) {
// printf("result: %d count: %d\n", i, counters[i]);
//}
for (size_t i = 0; i < 1000000; i++) {
srand(tt + i);
counters[rand() % 7] ++;
}
for (size_t i = 0; i < 7; i++) {
printf("result: %d count: %d\n", i, counters[i]);
}
}
有了这个,在Windows 7上,Visual Studio 2013编译为C ++我得到
result: 0 count: 142894
result: 1 count: 142850
result: 2 count: 142848
result: 3 count: 142855
result: 4 count: 142854
result: 5 count: 142845
result: 6 count: 142854
你得到了什么,因为我怀疑你会从更大的数据集中获得更好的结果。