【发布时间】:2026-01-16 17:40:01
【问题描述】:
注意事项:
- 我的编译器是 g++ 5.1.0-2 和 c++14 语言标准
- 我的 IDE 是 Code::Blocks(我也在 Dev-C++ 上尝试过代码)
- 我测试代码的在线 IDE 是 http://cpp.sh/ (C++ shell) 和 https://www.codechef.com/ide (CodeChef.com 的 IDE) 都运行 c++14
- 使用在线 IDE 时代码运行正常,这让我更加困惑。
代码如下:
#include <iostream>
#include <random>
#include <cstdlib>
#include <ctime>
#include <chrono>
int main() {
srand(time(0));
long long seed = rand();
std::default_random_engine rand_num(seed);
std::uniform_int_distribution<long long> range(0, 10);
long long a = range(rand_num);
long long b = rand_num();
std::cout<<seed<<"\n"; // the seed is different every time (tested)
std::cout<<a<<"\n";
std::cout<<b<<"\n";
system("pause");
return 0;
}
在我自己的计算机上运行代码时,带有 std::uniform_int_distribution (a) 的那个不是随机的,但可以正常工作并在在线 IDE 上创建一个随机数。
没有 std::uniform_int_distribution (b) 的那个在在线 IDE 和我自己的电脑上都可以正常工作。
有什么问题?我该如何解决?
更新:代码在 mt19937 引擎(std::mt19937 和 std::mt19937_64)上运行正常
【问题讨论】:
-
您是否尝试打印
seed和调用time(0)的结果,以查看非随机性的来源? -
@Pixelchemist 是的,种子每次都不一样。 (将信息添加到问题中)
-
好的,您是否在打印整个序列时测试了多次运行? (
for(unisgned i=0; i<10; ++i) { std::cout << range(rand_num) << ' '; }) -
@Pixelchemist 是的。事实上,我在使用 for 循环创建随机数组时发现了这个问题。
-
我用 gcc 4.8/c++11 对其进行了测试,它按预期工作。看起来像是特定 stl 版本的实现中的错误。你能更精确地指定 gcc 版本吗? gcc.gnu.org 上不存在版本号 5.10-2。
标签: c++ c++11 random compiler-errors