解决随机数逻辑

时间:2016-11-22 13:09:39

标签: php random logic

我有一个名为myrand()的函数,它生成从1到5的随机数。我想通过使用myrand()生成另一个函数,它将生成从1到7的随机数。我写了类似的东西

function newrand() {
    return myrand()+2;
}

以上逻辑不是我想要它永远不会返回我1或2.我不想使用任何if条件所以我该怎么做才能为随机数制作逻辑。

3 个答案:

答案 0 :(得分:1)

在PHP中有一个名为rand()的函数来执行此操作。请尝试以下代码:

function newrand() {
    return rand(1, 7);
}

或者让我们说myrand()就像下面的代码:

function myrand() {  return rand(1,5); }

您可以做的是,将上限传递给myrand() myrand(5)myrand(7)而不是myrand() + 2。如下:

myrand($max) {
     return rand(1, $max);
}

并将其称为:

function newrand() {
    return myrand(7);
}

答案 1 :(得分:0)

当您编写某种rand()函数时,考虑二进制数表示而不仅仅是常规数字会更好。

例如,要获得0到7范围内的随机数,您必须得到3位的相等分布。

000  # 0
001  # 1
010  # 2
...
111  # 7

如果您可以将myrand()视为以相等概率产生1到5的数字的函数,那么您可以通过组合rand()生成的前2位来构造任何myrand()函数调用

func rand_bits_2() { return (myrand() - 1) & 0b11; }

func rand_bits_4() {
    hi = rand_bits_2() << 2;  // first 2 random bits
    lo = rand_bits_2();       // consecutive 2 random bits
    return hi | lo; 
}

4个随机位产生0到15之间的数字。进一步考虑这个想法,你可以得到例如myrand7()

UPD:您可以找到更多here

答案 2 :(得分:0)

假设您的函数统一生成15之间的数字。要在17之间统一生成数字,请执行以下操作:

  1. 生成7随机数

    x1 ... x7

  2. 使用您的函数

    15之间

    1. 计算样本总和

      s = x1 + x2 + ... + x7

    2. <强>返回

      (s - 7 mod 7)+ 1

    3. 其中(s - 7 mod 7)s - 7 7整数除法的非负提醒。

      以下是我在生成100000个样本重复上述3个步骤之后获得的随机频率的示例:

      1 -> 14331
      2 -> 14447
      3 -> 14489
      4 -> 14095
      5 -> 14293
      6 -> 14157
      7 -> 14188
      

      ,正如您所看到的,看起来非常均匀。