我正在编写此代码以运行10000000次并随机生成一个数字并选择最常生成的数字,但结果似乎并不是随机的。我写的是
public class Randomizer {
public static int[][] numbers = new int[45][2];
public static int maxN = 0;
public static int finalChoice;
public static void main(String[] args){
int arithmoi[] = new int[5];
for(int i =0; i < 5; i++){
arithmoi[i] = randomizer(1000000, 45);
System.out.println("A "+i+": "+arithmoi[i]);
}
int extra_num = randomizer(1000000, 20);
System.out.println("\nT: "+extra_num);
}
public static int randomizer(int times, int amount){
int[][] numbers = new int[amount][2];
for(int i = 0; i < amount; i++){
numbers[i][0] = i + 1;
numbers[i][1] = 0;
}
for(int i = 0; i < times; i ++){
int rnd = (int)(Math.random() * amount + 1);
for(int j = 0; j < amount; j++){
if(rnd == numbers [j] [0]){
numbers[j][1] ++ ;
break;
}
}
}
for(int i = 0; i < amount; i++){
if(maxN < numbers[i][1]){
finalChoice = numbers[i][0];
maxN = numbers[i][1];
}
}
return finalChoice;
}
}
它给我的结果是A 0:36 1:36 A 2:36 A 3:36 A 4:29
T:14,A 0:26 1:14 A 2:44 A 3:44 A 4:44
T:4 和类似的。问题是什么?import java.util.Random;
public class Randomizer {
public static int[][] numbers = new int[45][2];
public static int maxN = 0;
public static int finalChoice;
public static void main(String[] args){
int arithmoi[] = new int[5];
for(int i =0; i < 5; i++){
arithmoi[i] = randomizer(1000000, 45);
System.out.println("A "+(i+1)+": "+arithmoi[i]);
}
int extra_num = randomizer(1000000, 20);
System.out.println("\nT: "+extra_num);
}
public static int randomizer(int times, int amount){
int[][] numbers = new int[amount][2];
Random randomGenerator = new Random();
for(int i = 0; i < amount; i++){
numbers[i][0] = i + 1;
numbers[i][1] = 0;
}
for(int i = 0; i < times; i ++){
int rnd = randomGenerator.nextInt(amount);
for(int j = 0; j < amount; j++){
if(rnd == numbers [j] [0]){
numbers[j][1] ++ ;
break;
}
}
}
for(int i = 0; i < amount; i++){
if(maxN < numbers[i][1]){
finalChoice = numbers[i][0];
maxN = numbers[i][1];
}
}
return finalChoice;
}
}
新代码的结果仍然相同(我使用了随机类)
答案 0 :(得分:0)
您应该使用Java的Random类(java.util.Random)而不是编写自己的类。它由专家撰写,并且经过多年的改进,因为它被使用并因此被数百万人测试。已经证明它可以生成没有任何特定模式的伪随机数。
编写自己的伪随机生成器并不是直截了当的,因为涉及很多因素。
以下是其使用示例:
Random random = new Random();
int maxIterations = 10000000;
int maxRandomValue = 100;
for(int i=0; i< maxIterations; i++)
{
System.out.println("Next random value: " + random.nextInt(maxRandomValue));
}
答案 1 :(得分:0)
我认为你的主要问题是你厌倦了解决任务的方式。
int[][] numbers = new int[amount][2];
的第一个包含冗余信息,因为numbers[*][0]
保持位置。由于numbers[i][1]
包含位置i + 1
的结果,因此您可以将结构缩减为int[amount]
。
与其他语言不同,java将int
数组的初始状态定义为始终为零,因此您不需要第一个循环。
你的任务是让它在一条线上下雨并在n轮之后检查,有多少雨滴撞到某个位置/位置。
循环n次是可以的,但由于rnd.nextInt(amount)
已经为你提供了雨滴降落的地方,你不必迭代找到它。
for(int i = 0; i < times; i++) {
number[rnd.nextInt(amount)]++;
}
这将模拟雨滴,但为了获得适当的随机性,您应该在班级而不是方法级别初始化private static Random rnd = new Random()
。
我希望这有助于解决您的任务。