如何在0到9之间生成1000个随机数?

时间:2015-08-17 12:40:12

标签: java random numbers generator

如何使用用户提供的值生成0到9之间的1000个随机数?

  1. 程序需要允许用户选择事实值, 常数,模数和起始种子数。

  2. 它应该使用这些值在0到9之间生成1000个随机数。

  3. 存储在数组中生成每个数字的次数。

  4. 在最后输出数字的分布。

  5. 这是我到目前为止所做的事情,但到目前为止,我只是让用户输入信息,所以,我距离第2,3和4号还很远。

    public static void main(String[] args) {
        int fact;
        int constant;
        int modulus;
        int seednumber;
    
        Scanner scan = new Scanner(System.in);
        System.out.println("Input Fact: ");
        fact = scan.nextInt();
    
        System.out.println("Input Const: ");
        constant = scan.nextInt();
    
        System.out.println("Input M: ");
        modulus = scan.nextInt();
    
        System.out.println("Input Seed: ");
        seednumber = scan.nextInt();
    
        int [] arrayBox;
        arrayBox = new int [10];
        for (int i=0; i<10; i++){
            arrayBox[i]=0;
          }
    
        int noOfNumberGenerated=0;
        while (noOfNumberGenerated<1000){
            seednumber=(((fact*seednumber)+constant)%modulus);
    }
    

2 个答案:

答案 0 :(得分:1)

首先不需要这部分:

for (int i=0; i<10; i++){
        arrayBox[i]=0;
}

默认情况下,数组将填充为0

第2部分和第3部分:

Random randomGenerator = new Random(seed);
for (int idx = 0; idx < 1000; idx++){
  int randomInt = randomGenerator.nextInt(10);
  arrayBox[randomInt] = arrayBox[randomInt] + 1
}   

第4部分:

for(int i =0; i< 10; i++){
   System.out.println("amount of "+i+" is "+arrayBox[i]);
}

- edit-- 作为对您的评论的回应,Java中的Random类本身就是LGC的一个实现,被认为是更好的一个。常量被硬编码为

fact = 25214903917
constant = 11

这些数字经过大量测试后被选中,我相信你可以在互联网上找到很多关于它的文档。

在您的情况下,您有2个选项。强制Random使用您的常量或自己编写。选项1将为您提供一个较弱的随机类版本,但它仍然会更强大&#39;然后选择2。

1:

public class RandomCustom extends Random{

    //You have to Override this aswell.
    @Override
    synchronized public void setSeed(long seed) {
        this.seed.set(initialScramble(seed));
        haveNextNextGaussian = false;
    }

    @Override
    protected int next(int bits){
        long oldseed, nextseed;
        AtomicLong seed = this.seed;
        do {
            oldseed = seed.get();
            nextseed = (oldseed * fact + constant) & modulus;
        } while (!seed.compareAndSet(oldseed, nextseed));
        return (int)(nextseed >>> (48 - bits));
    }
}

之后只需更改Random顶部代码中的RandomCustom即可。

在我看来,为什么要尝试重新发明轮子,而不是使用已被证明是坚固且有效的东西

答案 1 :(得分:1)

如果您计划使用Random类,则不需要所有这些输入参数。你所需要的只是一个长种子和用于生成的模数(如果需要的话代数):

$file_content = file_get_contents($file_path); // Read the file's contents
if(file_exists($file_path)){
    unlink($file_path);
}
force_download($filename, $file_content);