Goh*_*han 31 c c++ random visual-c++
我只是好奇,单线程程序可以连续两次调用获得相同的返回值rand()吗?
那么,这个断言会不会发生?
assert(rand() != rand());
Run Code Online (Sandbox Code Playgroud)
nos*_*nos 46
如果我们能找到一个例子,你问题的答案就是"是".
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
unsigned int i;
for(i = 0; ; i++) {
int r = rand();
if (r == rand()) {
printf("Oops. rand() = %d; i = %d\n", r, i);
break;
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Oops. rand() = 3482; i = 32187使用Visual Studio 2010在Windows上打印.
编辑:使用下面的版本检测2连续rand()调用返回相同值的所有序列.C仅指定rand()应返回"0到RAND_MAX范围内的伪随机整数",RAND_MAX应至少为32767.对PRNG的质量或其实现或其他细节(如是否连续2次rand()调用可以返回相同的值.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
unsigned int i;
int r1 = rand();
int r2 = rand();
for(i = 0; ; i++) {
if (r1 == r2) {
printf("Oops. rand() = %d; i = %d\n", r1, i);
}
r1 = r2;
r2 = rand();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Goh*_*han 30
发现我的compiler(msvc10)的rand实现确实使用了线性同余生成器,就像其他c/c ++编译器一样
线性同余生成器使用递归方法.
ptd - > _ holdrand(n)永远不会等于ptd - > _ holdrand(n + 1),但mod结果将相等.
@nos显示结果
return( ((ptd->_holdrand = ptd->_holdrand * 214013L + 2531011L) >> 16) & 0x7fff );
ptd->_holdrand = 2375716238;
return 3482; (2375716238 >> 16) % 32768
ptd->_holdrand = 228240921;
return 3482; (228240921 >> 16) % 32768
Run Code Online (Sandbox Code Playgroud)
最后的答案是rand()将作为我的直觉两次返回相同的值.
一个好的随机数生成器有时应该连续两次返回相同的值.假设它返回正整数0 <= r <2 ^ 31.对于完美的随机数发生器,两个连续数字相同的可能性大约为20亿.在1000亿次通话中没有获得两个相同数字的机会大约是10 ^ 15中的一个.
| 归档时间: |
|
| 查看次数: |
4209 次 |
| 最近记录: |