- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
这与这个问题有关 - random number generation in C++ ... first number not very random
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
srand((unsigned int)time(NULL));
cout << rand() / double(RAND_MAX) << endl;
cout << rand() / double(RAND_MAX) << endl;
cout << rand() / double(RAND_MAX) << endl;
cout << rand() / double(RAND_MAX) << endl;
cout << rand() / double(RAND_MAX) << endl;
return 0;
}
如果您一遍又一遍地运行二进制文件 (.exe),您会注意到第一个结果的前三个数字始终相同。例如。每次运行总是 0.54xxxxx。
不,这不是因为我发现了没有模式的地方。在每次运行之间等待几秒钟也无济于事。
编辑:只有第一个结果的前三个数字相同。其余的是“随机查找”。此外,生成器使用 srand() 作为种子(在上面代码示例的第一行)。
最佳答案
rand
的随机性未由标准指定。最多生成器将使用种子来初始化静态变量,并以一种应该的方式从中计算下一个值“出现”随机(但当然是完全确定的)。我的猜测是你机器上的实现返回静态变量的旧值,等于种子第一次通过。 (这让我很惊讶,通常返回静态的新值。)
无论如何,这是实现质量的问题。(我在 VC++11 中看到了同样的事情,但在 g++ 中却没有。)
编辑:
只是一个快速测试,看看不同的种子如何影响第一个返回的数字:
for ( int i = 1; i <= 10; ++ i ) {
std::srand( i );
std::cout << i << ": " << std::rand() << std::endl;
}
VC++11 的输出:
1: 41
2: 45
3: 48
4: 51
5: 54
6: 58
7: 61
8: 64
9: 68
10: 71
使用 g++ 4.7.2(CygWin 版本):
1: 1481765933
2: 816048218
3: 150330503
4: 1632096437
5: 966378722
6: 300661007
7: 1782426941
8: 1116709226
9: 450991511
10: 1932757444
你说你在代码块下用 g++ 看到了这个:我只能猜测 Code Blocks 设置了一些东西,以便 g++使用 Microsoft 库,而不是 GNU 库(通常是更好的解决方案)。
无论如何,解决方法很简单:替换你现在的单行用于为生成器播种:
std::srand( std::time( NULL ) );
std::rand(); // throw out first value...
如果您需要相对较好的随机数,请删除 std::rand
完全支持一些定义更严格的C++11 中的生成器。 (如果你不是,你可以从 Boost 获得它们使用 C++11。)
关于c++ - 为什么 rand()/double(RAND_MAX) 的第一个结果不是随机的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17598547/
这个简单的代码: int main() { srand(time(NULL)); const int size = rand() % RAND_MAX; int numbers[si
我希望生成介于 0 和 1 之间的随机数。(显然,这在其他地方也有应用。) 我的测试代码: #include #include #include int main() { double uR;
这website声明宏 RAND_MAX 的值是库相关的,最小值为 32767。它没有进一步详细说明。 依赖库是什么意思??这是否意味着假设有来自两个不同库的两个宏 RAND_MAX,我们必须通过使用
我正在尝试确定 RAND_MAX 是否可以放入 unsigned int 变量中。翻阅C99标准后,我只发现RAND_MAX保证值至少为32767。虽然我知道RAND_MAX扩展为int值,但我不确定
Accelerated C++ Andrew Koenig 的第 7-9 题问: 7-9. (difficult) The implementation of nrand in §7.4.4/135
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
这个问题已经有答案了: How to get a larger random number from the c function rand() (4 个回答) 已关闭 8 年前。 我知道 RAND_
我的作业涉及生成 0 和 2^30 之间的随机整数。现在,在过去我们了解到 rand() 只返回小于 RAND_MAX 的整数,这小于 UINT_MAX,并且我们可以使用位移来填充 UINT_MAX
这个表达式是如何工作的? Num*rand() / RAND_MAX 例如,如果我用 7.7 替换数字,它会给我从 0. 到 7. 的值(双)。 最佳答案 rand()函数生成 0 之间的整数值和
我想找到一种在 C 中获取随机数的不偏斜的方法(尽管我最多将它用于 0-20 的值,更可能只有 0-8)。我看过这个公式,但在运行了一些测试后,我不确定它是否有偏差。有帮助吗? 这里是使用的完整函数:
我查阅了 C 标准(自 1999 年起),它只说 RAND_MAX 应该至少为 32767,但没有说明这个宏应该扩展为有符号整数还是无符号整数。单一 UNIX 规范(link 1、link 2)和 L
为什么它不是const?我认为这不是一个明确的 C++ 方式。也许有更多的 C++ 方法来生成随机数,是吗? 最佳答案 RAND_MAX 来自 C 标准库,它被定义为一个宏。 在 C 中,宏是定义 l
这与这个问题有关 - random number generation in C++ ... first number not very random #include #include #inc
generate(vec.begin(), vec.end(), [=](){return static_cast(static_cast(ran()) /RAND_MAX*(max-min)+min
我对 C++ 很感兴趣,尽管我怀疑它只是导入了 C 标准定义。我相信标准所说的答案是否定的,但我对实际答案最感兴趣。 如果 RAND_MAX 始终为 (2^n)-1(其中 n 是某个自然数 - 实际上
我试图使用 rand() 生成一些随机数,但我首先检查了 RAND_MAX,因为我想生成一些大数。在 Windows 10 中 printf("%x",RAND_MAX); 给出 0x7fff 而在
当 RAND_MAX 的值为 0.000000。 RAND_MAX 不应该为 rand() 函数生成的数字设置最大值吗? #include #include int mai
我看了很多地方,似乎找不到答案。我明白rand() / RAND_MAX == 1的概率低是因为 rand()不太可能等于 RAND_MAX . 但是理论上可行吗? 我看到有人写类似的东西,范围是 [
我正在阅读 C FAQ并在 question 中找到它建议我使用 rand()/(RAND_MAX/N + 1) 而不是更流行的方式 rand() % N。 这样做的原因是,当 N 是一个小数时,ra
如何生成 0 到 n 范围内的随机数,其中 n 可以是 > RAND_MAX(在 C、C++ 中)? 谢谢。 最佳答案 将生成分成两个阶段,然后组合生成的数字。 关于c++ - 生成 0 到 n 范围
我是一名优秀的程序员,十分优秀!