Poj 1597 – Uniform Generator



 

题目的意思就是一个生成随机数的函数,

     Seed[x+1] = seed[x] + STEP % MOD

其中seed就是我们生成出来的随机数,至于seed[0]是哪个数并不重要,后面会证明。STEP就是我们每次往前一个所加的值,再moduleMOD得到下一个随机数。

 

判断这个随机生成函数的好坏的依据是如果能够产生0~MOD-1内的所有数,就是一个好的,否则坏。

 

我们知道了同余的特性,便可以假设在k步之后,生成的seed[k] = seed[0],所以由此有

        Seed[k] = seed[0] + STEP*k % MOD

那么,

        STEP * k = MOD

 

而我们如果要生产MOD个数,必须使kMOD,而且k不可能大于MOD,因为这个条件下生成的数又开始重复,所以k=MOD在前面的条件下,如果STEPMOD有大于1的公约数例如d,那么会有STEP*(k/d) = MOD,这就是一个循环了,只会产生k/d<MOD个随机数。

结论:iff gcd(STEP, MOD) == 1, good choice.