【问题标题】:How to expand the range of a random integer from 1-10 to 1-200如何将随机整数的范围从1-10扩大到1-200
【发布时间】:2017-08-20 17:49:40
【问题描述】:

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

【问题讨论】:

    标签: c random numbers generator


    【解决方案1】:

    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值都可以作为适应度值。有更复杂的测试、卡方等进行更复杂的分析。

    【讨论】:

      【解决方案2】:

      调用基函数 3 次并缩放结果。

      int rand1to200() {
        return ((rand1to10() - 1)*100 + 
           (rand1to10() - 1)*10 + 
           (rand1to10() - 1)*1)%200 + 1;
      }
      

      【讨论】:

      • 您没有完全回答 OP 的问题。当存在一个正整数 10^n 可被 200 整除(此处为 n == 3)时,您的答案在这种特殊情况下有效。但是,如果问题是“从 1 到 173 的随机数”呢?那么你的算法不会以相同的概率统一给出从 1 到 173 的所有数字。
      • @FREE_AND_OPEN_SOURCE 这确实回答了 OP 的狭义问题(10,200)。 OP 的帖子并不表示希望得到一般性答案。至于n (200) 是否不是m (10) 的幂的因数,答案会更复杂。然而,为什么要停在那里?可以将 m.nany int 值一起使用 - 甚至可能是 0 和负数。该解决方案将涉及更多,特别是如果m &gt; sqrt(RAND_MAX) 和 IMO,将远远超过 OP 现在准备好的。
      猜你喜欢
      • 2010-09-13
      • 1970-01-01
      • 2010-11-26
      • 2016-02-09
      • 2013-11-13
      • 1970-01-01
      • 1970-01-01
      • 2019-04-28
      • 1970-01-01
      相关资源
      最近更新 更多