📜  在Java中使用中间平方方法生成随机数

📅  最后修改于: 2022-05-13 01:54:39.150000             🧑  作者: Mango

在Java中使用中间平方方法生成随机数

这种方法是由范诺依曼提出的。在这种方法中,我们有一个种子,然后将种子平方,并将其中期作为随机数获取。考虑我们有一个有 N 位数字的种子,我们将该数字平方以获得 2N 位数字,如果它不是 2N 位数字,我们在数字前添加零使其成为 2N 位数字。一个好的算法基本上是不依赖于种子的算法,并且周期也应该尽可能长,在它开始重复之前几乎应该触及其范围内的每个数字作为经验法则记住,周期越长越随机号码。

例子:

Consider the seed to be 14 and we want a two digit random number.
Number --> Square --> Mid-term
14     --> 0196   --> 19 
19     --> 0361   --> 36
36     --> 1296   --> 29
29     --> 0841   --> 84
84     --> 7056   --> 05
05     --> 0025   --> 02
02     --> 0004   --> 00
00     --> 0000   --> 00 

在上面的例子中,我们可以注意到我们得到了一些随机数 19,36,29,84,05,02,00 似乎是随机选择,这样我们得到了多个随机数,直到我们遇到一个自重复链.我们还了解了这种方法的一个缺点,即如果我们遇到 0,那么我们会从该点得到一串 0。另外,考虑到我们得到一个随机数 50,平方将是 2500,期中考试又是 50,我们进入了这个 50 的链,有时我们可能会更频繁地遇到这样的链,这是一个劣势,因为这些劣势这种方法实际上并不用于生成随机数。

执行:

Java
// Generate Random Numbers Using Middle
// Square Method in Java
import java.util.Random;
  
public class Main {
    static int rangeArray[]
        = { 1,      10,      100,      1000,     10000,
            100000, 1000000, 10000000, 100000000 };
    // function for generating a random number
    static long middleSquareNumber(long num, int digit)
    {
        long sqn = num * num, nextNum = 0;
        int trim = (digit / 2);
        sqn = sqn / rangeArray[trim];
        for (int i = 0; i < digit; i++) {
            nextNum += (sqn % (rangeArray[trim]))
                       * (rangeArray[i]);
            sqn = sqn / 10;
        }
        return nextNum;
    }
    public static void main(String args[])
    {
        int numberOfDigit = 3;
        int start = rangeArray[numberOfDigit - 1],
            end = rangeArray[numberOfDigit];
        // create rand object
        Random rand = new Random();
        long nextNumber = rand.nextInt(end - start) + start;
        System.out.print(
            "The random numbers for the Geeks are:\n"
            + nextNumber + ", ");
        // Generating 10 random numbers
        for (int i = 0; i < 9; i++) {
            nextNumber = middleSquareNumber(nextNumber,
                                            numberOfDigit);
            System.out.print(nextNumber + ", ");
        }
    }
}


输出
The random numbers for the Geeks are:
325, 562, 584, 105, 102, 40, 160, 560, 360, 960, 

注意:上面的程序显示了中间平方数方法的工作原理,您可以多次运行该程序以查看每次生成的不同随机数。由于其缺点,不建议将此方法作为生成随机数的理想方法,但该方法也可以用作散列算法和其他一些应用程序。