【发布时间】:2014-06-27 17:57:56
【问题描述】:
所以想弄清楚 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。
【问题讨论】:
-
你应该只调用一次
srand()。 -
即使使用reseed,它仍然会打印出一堆3。我希望 rand() 开始值每秒都在变化,因为 time() 每秒都在变化,但似乎没有。 srand() 显然不是那么精细。
-
@RobertHarvey 他正在通过
time()更改种子并休眠。它们之间的关系完全不明显。我最初的经历是 100 次迭代都将在一秒钟内完成,所以time()都将返回相同的数字。 -
我使用 gcc 4.8.2 得到以下输出序列:
6 1 3 6 3 5 1 5 0 2。我将循环更改为仅计算 10 次。 -
我读了这个,然后是元数据,然后是这个,然后是元数据,然后 THEN 我理解了这个问题。我认为。问题是为什么 rand()%7 总是返回 3 ,即使种子有 100 个唯一时间。这个问题非常不清楚。特别是因为有几个我不熟悉的缩写和符号:“`如果我使用任何 n s.t. !(7|n),`”