Java随机生成数字错误

时间:2015-03-14 18:19:19

标签: java random

我正在编写此代码以运行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;

    }



}

新代码的结果仍然相同(我使用了随机类)

2 个答案:

答案 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()

我希望这有助于解决您的任务。