【问题标题】:How do I generate 1000 random numbers between 0 and 9?如何生成 0 到 9 之间的 1000 个随机数?
【发布时间】:2015-11-10 02:33:55
【问题描述】:

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

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

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

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

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

这是我到目前为止所做的,但我直到现在才让用户输入信息,所以,我离达到第 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);
}

【问题讨论】:

  • "我必须首先说我是Java新手。我以前用C做过这个,但我真的不知道如何用Java完成这段代码。我正在自学,从我从 Stackoverflow 和 NetBeans 上的文档中获得的信息。我正在做一个小练习,我在 RosettaCode 上找到了更多关于 Java 的知识,但我需要有人帮助我进行编码。”这与问题有什么关系?
  • 0 到 9 之间有哪些数字?整数?要包括 0 和 9 吗?
  • Random 看看这个。
  • 如果你以前在 C 中做过,你已经整理出了一些困难的部分,其余代码将与 C 实现非常相似,除了写入标准输出可以通过System.out.println() 实现。

标签: java random numbers generator


【解决方案1】:

如果您打算使用 Random 类,则不需要所有这些输入参数。您只需要一个长种子和用于生成的模数(如果需要,还需要生成的数量):

import java.util.*;

public class RandomNumbers {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("Input Long Seed: ");
        long seed = scan.nextLong();

        System.out.println("Input Modulus: ");
        int modulus = scan.nextInt();

        System.out.println("Number of Iterations: ");
        int iterations = scan.nextInt();

        int[] arrayBox =new int[modulus];

        Random random = new Random(seed);

        for (int i=0;i<iterations;i++){
            arrayBox[random.nextInt(modulus)]++;
        }

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

【讨论】:

  • 我实际上迫切需要所有这些输入参数来生成数字。然后,我将继续对其进行测试。我不能让它只是随机选择值,它是密码学的一部分。
【解决方案2】:

首先这部分不需要:

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
}   

第四部分:

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

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

fact = 25214903917
constant = 11

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

在您的情况下,您有 2 个选项。强制Random 使用您的常量或自己编写。选项 1 将为您提供 Random 类的较弱版本,但仍将比选项 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));
    }
}

在此之后,只需从 RandomCustom 顶部的代码更改 Random 即可。

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

【讨论】:

  • 我实际上正在尝试实现一个线性同余生成器,这就是为什么我需要用户输入 Fact、Constant、Modulus 和 Seed 以用于以下等式:seednumber=(((fact*seednumber )+常数)%模数);
  • 在这种情况下,您可以做的是查看 Random 类的代码。只需覆盖 next() 方法并使用您从输入中收到的参数。我将用一个可能的代码示例更新我的答案。
猜你喜欢
  • 2011-04-29
  • 1970-01-01
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
  • 2014-04-11
  • 2011-08-10
  • 1970-01-01
  • 2012-12-10
相关资源
最近更新 更多