How long does the stream of Random().Next() take until it repeats?

家住魔仙堡 提交于 2019-12-03 17:47:24

问题


Consider the .NET Random stream:

var r = new Random(); 
while (true) 
{ 
    r.Next(); 
}

How long does it take to repeat?


回答1:


According to the documentation:

Pseudo-random numbers are chosen with equal probability from a finite set of numbers. The chosen numbers are not completely random because a definite mathematical algorithm is used to select them, but they are sufficiently random for practical purposes. The current implementation of the Random class is based on Donald E. Knuth's subtractive random number generator algorithm. For more information, see D. E. Knuth. "The Art of Computer Programming, volume 2: Seminumerical Algorithms". Addison-Wesley, Reading, MA, second edition, 1981.

The subtractive generator (Knuth, Vol 2) Xf,n = (Xf,n-k - Xf,n-j) mod 1. See Knuth for a table of possible values of k and j. We choose k = 63, j = 31. This generator is interesting because:

  • It has a long period. The period of the least significant bit in this sequence is 2k-1. The actual period is much longer than this.
  • With some mild restrictions, the floating point arithmetic involved is exact!

The second property holds when X is of the form l 247 (0 � l < 247) Single-precision arithmetic is exact on the Crays (48-bit mantissa) and as is double-precision arithmetic on IEEE-compliant machines.

This allows the basic random number sequence to be generated by the Fortran code

  x(n) = x(n-k) - x(n-j)
  if (x(n) < 0.0) x(n) = 1.0 + x(n)

In practice random numbers are generated in batches as needed and stored in an array which acts as a circular buffer.

The algorithm mentioned has a period that depends on the seed value - you can find more details here.



来源:https://stackoverflow.com/questions/2050392/how-long-does-the-stream-of-random-next-take-until-it-repeats

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!