如何将随机整数的范围从1-10扩展到1-200

时间:2017-03-27 20:51:28

标签: c random numbers generator

给定一个在1到10范围内均匀生成随机整数的函数,如何编写一个在1到200范围内均匀生成随机整数的函数?

2 个答案:

答案 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;
}