我的线性同余生成器中有一个问题。我有两个模量。如果我替换或移除其中任何一个,除了在末尾启动的计数器外,我没有任何输出,但是如果没有可使用该计数器处理的输出,那将毫无用处。

我需要应用程序输出介于0到9之间的数字,然后最后输出数字的分布。这是我的代码:

public static void main(String[] args) {
  int fact;
  int constant;
  int modulus;
  int seed;

  Scanner scan = new Scanner(System.in);

  System.out.println("Input fact: ");
  fact = scan.nextInt();

  System.out.println("Input constant: ");
  constant = scan.nextInt();

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

  System.out.println("Input seed: ");
  seed = scan.nextInt();

  int[] arrayBox;
  arrayBox = new int[10];

  for (int i = 0; i < 10; i++) {

    seed = (seed * fact + constant) % modulus; // First modulus

    System.out.println(seed);
    arrayBox[seed % 10] = arrayBox[seed % 10] + 1; // Second modulus
  }

  for (int i = 0; i < 10; i++) {
    System.out.print(+(100 * arrayBox[i] / 10) + "% ");
  }
}


有没有办法解决第二个模数问题,仍然让我的输出和计数器在我想要的范围内(0到9)工作?

最佳答案

我在遵循您要执行的操作时遇到了一些麻烦,但最终我认为您想要的是:

System.out.println(i + ":\t" + (100*arrayBox[i]/10) + "%");


请注意,该程序不会在任何地方保存实际的seed值,因此您将无法查看它们。

这是该程序的示例运行,其中包含一些合理的输入参数值:

Input fact:
257
Input constant:
31
Input modulus:
64
Input seed:
89
56
23
54
21
52
19
50
17
48
15
0:  10%
1:  10%
2:  10%
3:  10%
4:  10%
5:  10%
6:  10%
7:  10%
8:  10%
9:  10%

10-07 19:21