【发布时间】:2016-10-03 19:46:52
【问题描述】:
我已经阅读了很多关于这个主题的帖子:
How does rand() work? Does it have certain tendencies? Is there something better to use?
How does the random number generator work in C
这就是我得到的:
1) xn+1 取决于 xn,即先前生成的随机数。
2) 不建议在程序中多次初始化种子。
3) 使用rand()%2 随机生成 0 或 1 是一种不好的做法。
我的问题是:
1) 是否有任何其他库我错过了查看以生成完全随机数(0 或 1)而不依赖于先前的输出?
2) 如果有任何其他解决方法可以使用内置的rand() 函数来满足要求?
3) 在程序中多次初始化种子有什么副作用?
代码sn-p:
srand(time(NULL));
d1=rand()%2;
d2=rand()%2;
这里我的意图是让 d1 和 d2 完全相互独立。
我最初的想法是这样做:
srand(time(NULL));
d1=rand()%2;
srand(time(NULL));
d2=rand()%2;
但正如我之前提到的基于其他帖子的那样,我认为这是一种不好的做法?
那么,有人可以回答上述问题吗?如果我完全遗漏了一件显而易见的事情,我深表歉意。
【问题讨论】:
-
太宽泛了,问题太多了!你知道随机数和从伪随机数生成器获得的数字之间的区别吗? (提示:使用 PRNG:每个数字
x_i都完全依赖于之前的数字。当使用一些熵源(如时间)重新播种时,这种情况会发生变化;但这非常复杂,大多数人不理解后果) -
简短的回答是在程序开始时只调用一次
srand(time(NULL)),然后使用rand() / N生成您的号码。我们选择N = ceil((RAND_MAX+ 1) / 2),但是为了避免RAND_MAX == INT_MAX时溢出,我们用代码int N = RAND_MAX / 2 + 1计算。 -
@Dietrich Epp 您的 cmets 看起来很有趣,但看不出
rand() / N与rand() % 2的优势。甚至可以使用rand() & 1来避免div/mod代码。 -
@chux:
rand() % 2在编译时不会发出任何 div 或 mod 指令。但是,rand() & 1之所以不好,是因为许多随机数生成器的低位输出很差。线性同余生成器仍然并不少见,用 Wikipedia 的话来说,“当 m 是 2 的幂时,LCG 的低位不应该被依赖于任何程度的随机性。”