Каждый раз, когда вы вызываете 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;
}
}