给定一个在1到10范围内均匀生成随机整数的函数,如何编写一个在1到200范围内均匀生成随机整数的函数?
答案 0 :(得分:2)
让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
(你是偶数)。您可以考虑创建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
最后一列表示理想分布之间的差异,可以使用总和或最大值作为适应值。有更复杂的测试,卡方等,用于更复杂的分析。
答案 1 :(得分:1)
调用基本功能3次并缩放结果。
int rand1to200() {
return ((rand1to10() - 1)*100 +
(rand1to10() - 1)*10 +
(rand1to10() - 1)*1)%200 + 1;
}