Создание генератора случайных чисел в Java - сброс массива каждый раз - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь создать свой собственный Генератор случайных чисел в Java и использую формулу Фибоначчи с запаздыванием.

Это работает, когда я хочу захватить одно случайное число, но когда я хочу сгенерировать несколько случайных чисел, он просто извлекает одно и то же случайное число для всех итераций, а не удерживает новый массив для генерации следующего случайного числа число.

public class RNumbers {

    public static void main(String[] args) {

        RandomNumberGenerator rd = new RandomNumberGenerator();
        int number = rd.getNumber();

        System.out.println(number);

        for (int i = 0; i <= 100; i++) {
            int number2 = rd.getNumber();
            System.out.println(number2);
        }

    }

}
public class RandomNumberGenerator {

    public static int getNumber() {
        long seed = System.currentTimeMillis();     // start seed number for formula
        int length = (int) (Math.log10(seed) + 1);  // number of digits int the seed number
        int j = 3;                                  // will always grab the 3rd value from the seed
        int k = 7;                                  // will always grab the 7th value from the seed
        int mod = 10;                               // will always be the mod number for formula 
        int[] arr = new int[length + 1];            // array for seed numbers
        String stseed = String.valueOf(seed);       // seed to String for adding digits to array    

        // Take the seed number and turn it into an array of single digit numbers to mimic a sequence
        for (int i = 0; i <= length - 1; i++) {
            arr[i] = Character.getNumericValue(stseed.charAt(i));
        }   

        // calculate random number with inputs
        int number = (arr[length - j] + arr[length - k]) % mod;

        // add random number to the end of the array in the temp index
        arr[length] = number;

        // update array by shifting all indexes down
        for (int i = 0; i <= length - 1; i++) {
            arr[i] = arr[i + 1];
        }

        return number;
    }

}

1 Ответ

1 голос
/ 05 мая 2020

Каждый раз, когда вы вызываете getNumber(), вы повторно инициализируете состояние генератора. Если вы вызываете это несколько раз в течение одной миллисекунды, вы каждый раз инициализируете его в одном и том же состоянии, так что вы получите одно и то же значение. (Даже если вы вызываете его несколько раз в течение более длительного периода времени, изменится только часть цифр, поэтому вы все равно можете получить тот же результат.)

Вам необходимо кэшировать состояние и инициализировать его Once:

public class RandomNumberGenerator {

    private static long seed ;     // start seed number for formula
    private static int length ;  // number of digits int the seed number
    private static final int j = 3;                                  // will always grab the 3rd value from the seed
    private static final int k = 7;                                  // will always grab the 7th value from the seed
    private static final int mod = 10;                               // will always be the mod number for formula 
    private static int[] arr ;            // array for seed numbers

    static {
        seed = System.currentTimeMillis();
        length = (int) (Math.log10(seed) + 1) ;
        arr = new int[length + 1] ;
        String stseed = String.valueOf(seed);       // seed to String for adding digits to array    

        // Take the seed number and turn it into an array of single digit numbers to mimic a sequence
        for (int i = 0; i <= length - 1; i++) {
            arr[i] = Character.getNumericValue(stseed.charAt(i));
        }   

    }

    public static int getNumber() {

        // calculate random number with inputs
        int number = (arr[length - j] + arr[length - k]) % mod;

        // add random number to the end of the array in the temp index
        arr[length] = number;

        // update array by shifting all indexes down
        for (int i = 0; i <= length - 1; i++) {
            arr[i] = arr[i + 1];
        }

        return number;
    }

}

Я бы рекомендовал не делать все stati c (тем более, что вы не используете его как stati c в своем методе main):

public class RandomNumberGenerator {

    private long seed ;     // start seed number for formula
    private int length ;  // number of digits int the seed number
    private static final int j = 3;                                  // will always grab the 3rd value from the seed
    private static final int k = 7;                                  // will always grab the 7th value from the seed
    private static final int mod = 10;                               // will always be the mod number for formula 
    private int[] arr ;            // array for seed numbers

    public RandomNumberGenerator() {
        seed = System.currentTimeMillis();
        length = (int) (Math.log10(seed) + 1) ;
        arr = new int[length + 1] ;
        String stseed = String.valueOf(seed);       // seed to String for adding digits to array    

        // Take the seed number and turn it into an array of single digit numbers to mimic a sequence
        for (int i = 0; i <= length - 1; i++) {
            arr[i] = Character.getNumericValue(stseed.charAt(i));
        }   

    }

    public int getNumber() {

        // calculate random number with inputs
        int number = (arr[length - j] + arr[length - k]) % mod;

        // add random number to the end of the array in the temp index
        arr[length] = number;

        // update array by shifting all indexes down
        for (int i = 0; i <= length - 1; i++) {
            arr[i] = arr[i + 1];
        }

        return number;
    }


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...