平方取中法(midsquare method)是产生[0,1]均匀分布随机数的方法之一,亦称冯·诺伊曼取中法,最早由冯·诺伊曼(John von Neumann,1903-1957)提出的一种产生均匀伪随机数的方法。此法将一个2s位十进制随机数平方后得到的一个4s位数,去头截尾取中间2s位数作为一个新的随机数,重复上述过程可得到一个伪随机数列 [1]。
算法
平方取中法的步骤如下:
1. 选择一个m位数Ni作为种子。
2. 计算Ni的平方。
3. 若Ni^2不足2m个位,在前面补0以确保它有2m位。
4. 从这个数中选取中间m个位的数,即从10^(⌊m/2⌋+1)到10^(⌊m/2⌋+m)的数,将这个结果作为Ni+1。
优劣
平方取中法并不是一个非常优秀的随机数生成方法,因为它的周期通常较短,并且存在明显的弱点。例如,当起始数值是k×10^m的形式时,生成的序列会不断重复。尽管如此,这些问题很容易被察觉,而且由于其计算速度快,这个方法在ENIAC这样的早期计算机上还是有一定的应用价值。
例子
以下是平方取中法的一个例子,展示了从一个初始种子开始的几次迭代过程:
- 675248 → 455 959 861 504
- 959861 → 921 333 139 321
- 333139 → 110 981 593 321
- 981593 → 963 524 817 649
- 524817 → 275 432 883 489
通过这个例子,我们可以看到如何从一个种子开始,通过平方和取中间m位数的方式来生成下一个数,从而形成一个伪随机数序列。