随机值 Java 的种子值输出问题

Issues with seed value output of randomized values Java

提问人:JG2022 提问时间:3/12/2023 更新时间:3/12/2023 访问量:53

问:

我正在尝试在 java 中构建一个程序,用户插入一个值,并且数字达到该值,使用种子对值表进行伪随机化。例如,如果用户输入 5,程序将创建一个 5x5 的表,其中包含每个数字,直到一个重复,例如

this is the example

在此之后,该表应由提示用户输入的另一个值进行伪随机化。我的问题是随机化的值不正确,如下图所示,数字范围为 1-5。当用户输入 5 时,并且被种子值 22 伪随机化。有人可以帮忙吗?谢谢。

Output of my program versus expected output

这是我的代码:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.Scanner;

public class LabProgram {
    public static void main(String[] args) {
        Scanner scnr = new Scanner(System.in);
        System.out.println("Please enter the number of elements to be paired.");
        int input = scnr.nextInt();
        // Initialize a 1D Array
        int i = 0;
        // Append duplicates of pair values 1-input 
        List<Integer> pairs = new ArrayList<>();
        for (i = 1; i <= input; i++) {
            // Adds value twice to the array
            pairs.add(i);
            pairs.add(i);
        }

    // Prints pairs into a table and creates a new line every fifth value
    int count = pairs.size();
    int newLine = 0;
    for (i = 0; i < count; i++) {
        int pair = pairs.get(i);
        System.out.printf("%4d", pair);
        System.out.print("");
        newLine = newLine + 1;

        if (newLine == 5) {
            System.out.println("");
            // Reset lineCount back to 0 to allow for new calc to occur
            newLine = 0;
        }
    }
    System.out.println();

    System.out.println("Please enter a seed number for testing purposes.\n");
    int seed = scnr.nextInt();
   // Collections.shuffle(pairs, new java.util.Random(seed));
   Random randomGeneratorName = new Random(seed);

    // Print the pairs in a table with a max of 5 numbers per row
    count = pairs.size();
    newLine = 0;
    int[] usedNumbers = new int[input];
    int unusedNumbers = input * 2;
    for (i = 0; i < count; i++) {
        int index = pairs.get(i) - 1; // change index to start at 0
        int number = index + 1; // change number to start at 1
        if (usedNumbers[index] == 0) {
            System.out.printf("%4d", number);
            usedNumbers[index] = 1;
            unusedNumbers--;
            newLine++;
            if (newLine == 5) {
                System.out.println();
                newLine = 0;
            }
        }
    }
    System.out.println();

}

}

Java 数组 随机 种子

评论


答:

0赞 sorifiend 3/12/2023 #1

您非常接近解决方案。以下行是键,需要取消注释:

Collections.shuffle(pairs, new java.util.Random(seed));

你不需要玩,在你的最后一个循环中,你可以简单地使用与第一次完全相同的循环结构,因为所有的工作都为我们完成。使用您的代码,工作的最后一个循环可能如下所示:indexnumberCollections.shuffle

Collections.shuffle(pairs, new java.util.Random(seed));

// Print the pairs in a table with a max of 5 numbers per row
newLine = 0;
for (i = 0; i < count; i++) {
    int pair = pairs.get(i);
    System.out.printf("%4d", pair);
    System.out.print("");
    newLine = newLine + 1;

    if (newLine == 5) {
        System.out.println("");
        // Reset lineCount back to 0 to allow for new calc to occur
        newLine = 0;
    }
}

因此,有了这个输入:

5
22

我得到以下输出:

Please enter the number of elements to be paired.
5
   1   1   2   2   3
   3   4   4   5   5

Please enter a seed number for testing purposes.

22
   1   4   1   5   3
   2   3   5   4   2

评论

0赞 JG2022 3/13/2023
感谢您的解决方案,但您的输出不正确。当输入值为 5 且种子为 22 时,输出需要为: 请输入种子编号以进行测试。2 1 1 5 3 4 2 4 3 5
0赞 sorifiend 3/13/2023
@JG2022 如果你想要一个确切的输出,那么你不能使用 .我假设这是一个学校项目,如果是这样,那么你应该得到更多关于种子需要如何工作的信息,以及规则是什么,以便它每次都产生相同的输出。您将需要使用该种子信息自行创建逻辑。如需更多帮助,请编辑您的问题,以包含有关种子函数的额外信息。java.util.Random