【发布时间】:2020-12-07 06:06:49
【问题描述】:
首先,我知道播种时间种子的基本原理,我的程序的输出是部分随机的。但这让我很困惑。
在程序的后续执行中,七个随机生成的值可能如下所示:
14 14 47 70 84 2 24
14 28 42 52 31 10 12
63 25 4 50 20 27 56
63 19 55 44 65 60 52
14 16 17 40 54 77 4
63 6 79 36 51 85 39
其余的值看起来是随机的,但第一个值始终是 14 或 63。为什么会发生这种情况,我怎样才能让它完全随机?
该代码应该绘制一个随机的 Scrabble 字母而无需替换,并添加了一个 cout 语句用于调试目的。
#include <iostream>
using namespace std;
int main()
{
string bag = "AAAAAAAAABBCCDDDDEEEEEEEEEEEEFFGGGHHIIIIIIIIIJKLLLLMMNNNNNNOOOOOOOOPPQRRRRRRSSSSTTTTTTUUUUVVWWXYYZ";
srand(time(0));
for (int a = 0; a < 7; a++)
{
int i = rand()%bag.size();
cout << i << ' ';
bag.erase(i,1);
}
cout << endl;
return 0;
}
- 在 MacOS Catalina 10.15 终端中编译
- 配置为:--prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
- Apple clang 版本 11.0.0 (clang-1100.0.33.17)
- 目标:x86_64-apple-darwin19.6.0
- 线程模型:posix
【问题讨论】:
-
请发送minimal reproducible example。看来您可以将
Player::letter中的代码移动到main并仍然重现该行为。 -
我无法重现该行为。我得到随机的数字。您能否添加有关您正在使用的编译器以及编译命令的详细信息?
-
你连续执行程序的速度有多快?如果你做的很快,你可能有第一个数字是相同的,因为 srand(time(0)) 还没有播种不同的值。如果您在每次执行后等待 1 或 2 秒,我每次都有漂亮的随机数
-
rand远非最好的随机数生成器。实际上,这可能非常糟糕。 Here is a presentation on how bad and some better alternatives. -
@S.M.新输出:1607326196 63 77 56 91 1 78 52; 1607326199 14 3 69 81 8 36 0; 1607326201 14 94 24 75 53 69 88; 1607326203 14 88 44 69 4 10 84; 1607326204 63 85 6 67 87 27 36