-1

出于随机模拟的目的,以下算法是否足以产生 100 万个与大多数计算机语言中的简单 rand() 命令质量相同的伪随机十进制数?该算法的前提是使用 10 个质量十进制伪随机数,并将其扩展为 100 万个质量十进制伪随机数。

请注意以下只是一个算法,而不是真正的代码。

double rands[10] = {rand()}; /// initialize a vector of 10 quality pseudorands [0,1]
double expandedRands[1000000] = {0}; /// initialize a vector of size 1 million

for(int i = 0; i < 10; i++)
{
  for(double j = 0; j < 100000; j++) /// j goes from zero to one hundred thousand
   {
   expandedRands[(100000 * i) + j] = rands[i] * abs((j - 0.5)/ 1000000);
   }
}

编辑:我意识到人类可以清楚地查看从该算法生成的数字并知道它们遵循某种模式,但真正的问题是,如果输入这些数字而不是 100 万个 rand() 数字,随机模拟是否会以相同的方式工作.

4

3 回答 3

2

您的算法不会生成均匀分布。

expandedRands[(100000 * i) + j] = rands[i] * (j / 100000);

首先,对于每个初始随机值

于 2014-06-19T02:11:19.300 回答
1

这根本不会生成 1,000,000 个伪随机数。

您正在通过使用加法、乘法和减法将只有 10 个“真实”伪随机数的数组扩展为 100 万个。

最后,你仍然只有 10 个随机数。

想想这个,如果系统函数rand()只产生一个二进制值,1 或 0。你被rands[10]全零填充的机会是:(0.5)^10,或大约 0.098%。

现在使用您的expandedRands[(100000 * i) + j] = rands[i] * (j / 100000);,您将用零填充整个 100 万个数字,因为rands[i]is 0,所以rands[i] * (j / 100000)is 0

如果您真的生成了 1,000,000 个数字,那么将所有数字都归零的机会有多大?

(0.5)^1000000 = 0。与这种情况发生一次相比,你更有可能赢得你甚至没有买的彩票。

于 2014-06-19T01:29:06.460 回答
0

随着 j 越来越大,您将以质量随机数 i (j/100000=1) 结束。

尝试在 Excel 中用图表绘制它,你会清楚地看到你收敛到你的随机数。

于 2014-06-19T01:33:19.700 回答