代码之家  ›  专栏  ›  技术社区  ›  psihodelia

特殊简单随机数发生器

  •  10
  • psihodelia  · 技术社区  · 14 年前

    如何创建一个函数,每次调用都会生成一个随机整数?这个数字必须是尽可能随机的(根据 uniform distribution )只允许使用一个静态变量,最多3个基本步骤,其中每个步骤仅包含 arity 1或2。

    例子:

    int myrandom(void){
      static int x;
      x = some_step1;
      x = some_step2;
      x = some_step3;
      return x;
    }
    

    基本的算术运算是+、-、%和、not、xor或、左移位、右移位、乘法和除法。当然,不允许使用rand()、random()或类似的东西。

    7 回复  |  直到 6 年前
        1
  •  42
  •   Chris Morgan    6 年前

    Linear congruential generators 是最古老和最简单的方法之一:

    int seed = 123456789;
    
    int rand()
    {
      seed = (a * seed + c) % m;
      return seed;
    }
    

    只有一些基本算术运算的指令,这就是你所需要的。

    请注意,只有在以下情况下,此算法才能正常工作 , C 以特定的方式选择!

    为保证该序列的最长可能周期, C 应该是互质的, ___1应能被 以及4个如果 可被4整除。

    一些 examples of parameters 如维基百科所示:例如一些编译器建议使用的ANSI C。 _=_2__ _=_1103515245和 C α=12345。

        2
  •  9
  •   misioptysio    9 年前
    public long randomLong() {
      x ^= (x << 21);
      x ^= (x >>> 35);
      x ^= (x << 4);
      return x;
    }
    

    种子不能为0。来源: http://www.javamex.com/tutorials/random_numbers/xorshift.shtml#.VlcaYzKwEV8

    wiki中的其他信息: https://en.wikipedia.org/wiki/Xorshift

        3
  •  3
  •   phimuemue    14 年前

    你可以看看 this . 这远远不是一个“完美”的随机数发生器,但它确实满足了你的要求,就我所见。

    Here 您可以找到一些关于随机数生成的附加信息。

        4
  •  0
  •   ShinTakezou    14 年前

    如果我写 man rand 我可以阅读posix.1-2001中给出的一个实现rand()和srand()的可能示例。参见 here . 如果你需要更复杂的东西,看看 GNU Scientific Library ;当然,您可以下载代码并查看实现。

        5
  •  0
  •   andand    14 年前

    Boost有一个非常好的随机数库,并且源代码是可用的,所以您可以尝试在那里查找并使用您需要的内容(即剪切和粘贴)。

        6
  •  -1
  •   Bill    14 年前

    这是一个在整个int范围内具有均匀分布的函数:

    int rand()
    {
      static int random = 0;
      return random++;
    }
    
        7
  •  -3
  •   Denis da Mata    9 年前

    我用这个

    SUBROUTINE GNA(iiseed)
        USE Variaveis
        parameter (ia=843314861,ib=453816693,m=1073741824, r231=1./2147483648.)
        INTEGER :: iiseed
    
        iiseed = ib + ia*iiseed
        if (iiseed.lt.0) iiseed = (iiseed+m) + m
        RndNum = iiseed*r231
    
    END SUBROUTINE GNA
    

    无需花费更多的计算时间为程序中的随机数生成器每次调用创建一个随机数生成器,就可以获得很大的随机性增益。

    这是一个很好的技巧!