【发布时间】:2017-08-20 17:49:40
【问题描述】:
给定一个在 1 到 10 范围内均匀生成随机整数的函数,如何编写一个在 1 到 200 范围内均匀生成随机整数的函数?
【问题讨论】:
标签: c random numbers generator
给定一个在 1 到 10 范围内均匀生成随机整数的函数,如何编写一个在 1 到 200 范围内均匀生成随机整数的函数?
【问题讨论】:
标签: c random numbers generator
让u()=uniform(1,10),你可以写你的新随机变量`
v() = 10*(u()-1) + u() + 100*I[u()>5]
请注意,您需要对 uniform 函数进行三次调用,但第三次可以是布尔变量。这里我用作指标函数
I[x] = x ? 1 : 0 // if x is true then 1 else 0.
代替u()>5,您可以等效地定义u()%2==0(u 是偶数)。您可以将创建 200 个不同的值视为 10 * 10 * 2,这需要对底层统一函数的三次调用,即使第三次仅用作二进制值。
这是一个awk 实现和直方图测试
awk 'function u() {return int(1+rand()*10)}
BEGIN {srand(); trials=100000;
for(i=1;i<=trials;i++) v[10*(u()-1)+u()+100*(u()%2)]++;
for(k in v) print k, v[k], (v[k]-trials/200)^2}' | sort -k3nr
最后一列表示理想分布之间的差异,无论是sum还是max值都可以作为适应度值。有更复杂的测试、卡方等进行更复杂的分析。
【讨论】:
调用基函数 3 次并缩放结果。
int rand1to200() {
return ((rand1to10() - 1)*100 +
(rand1to10() - 1)*10 +
(rand1to10() - 1)*1)%200 + 1;
}
【讨论】:
10^n 可被 200 整除(此处为 n == 3)时,您的答案在这种特殊情况下有效。但是,如果问题是“从 1 到 173 的随机数”呢?那么你的算法不会以相同的概率统一给出从 1 到 173 的所有数字。
n (200) 是否不是m (10) 的幂的因数,答案会更复杂。然而,为什么要停在那里?可以将 m.n 与 any int 值一起使用 - 甚至可能是 0 和负数。该解决方案将涉及更多,特别是如果m > sqrt(RAND_MAX) 和 IMO,将远远超过 OP 现在准备好的。