Java 基于seed的伪随机序列发生器
我设法根据一个种子制作了一个随机序列,但现在我正在尝试其他方法。基本上,它生成一个数字(基于种子),然后检查该数字是否已在数组中,如果不在数组中,则将其添加到数组中,如果是,则继续下一个。然而,我的程序运行良好,直到它达到0,然后它只是不断重复0。这是我的密码:Java 基于seed的伪随机序列发生器,java,Java,我设法根据一个种子制作了一个随机序列,但现在我正在尝试其他方法。基本上,它生成一个数字(基于种子),然后检查该数字是否已在数组中,如果不在数组中,则将其添加到数组中,如果是,则继续下一个。然而,我的程序运行良好,直到它达到0,然后它只是不断重复0。这是我的密码: public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.println("Enter a seed(
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("Enter a seed(One letter)");
String input = s.nextLine();
char a = input.charAt(0);
int b = ((int) a) - 96;
Random rnd1 = new Random(b);
int[] letters = new int[25];
boolean isSame = false;
for(int i = 0; i < 26; i++)
{
int c = rnd1.nextInt(26);
for(int x = 0; x < i; x++)
{
if(letters[x] == c)
{
isSame = true;
}
}
if(isSame == false)
{
letters[i] = c;
}
System.out.println(letters[i]);
}
}
publicstaticvoidmain(字符串[]args){
扫描仪s=新的扫描仪(System.in);
System.out.println(“输入种子(一个字母)”;
字符串输入=s.nextLine();
字符a=输入字符(0);
int b=((int)a)-96;
随机rnd1=新随机(b);
int[]字母=新int[25];
布尔值IsName=false;
对于(int i=0;i<26;i++)
{
int c=rnd1.nextInt(26);
对于(int x=0;x
将问题分解为几个部分,首先是一种测试索引0
和p
之间字母中的值的方法
private static boolean match(int[] letters, int p, int val) {
for (int i = 0; i < p; i++) {
if (letters[i] == val) {
return true;
}
}
return false;
}
然后可以调用它(并且可以使用Arrays.toString(int[])
)来输出数组,如下所示
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("Enter a seed(One letter)");
String input = s.nextLine();
char a = input.charAt(0);
int b = ((int) a) - 96;
Random rnd1 = new Random(b);
int[] letters = fill(rnd1, 26);
System.out.println(Arrays.toString(letters));
}
两个快速解决方案:
1) for循环将上升到索引25,即ArrayIndexOutOfBoundsException,因为数组的长度为25。
看起来您想要将数字0-25洗牌,也就是说,将每个数字只存储一次,但存储在数组中的随机位置。这也称为生成随机排列。假设是这种情况,那么您的代码有两个问题:
拾取新随机数时,isSame
需要设置为false,否则一旦重复一个数,isSame
对所有后续数都为true,并且不会向数组写入任何新内容
当选取数组中已经存在的随机数时(当发现IsName为true时),需要为该索引找到一个新的数。在代码中,将跳过该索引,该索引处的值将默认为0
也许还值得一提的是,有更有效的算法来解决这个问题。这种方法会不断选取大量随机数,然后将其丢弃,这是一种浪费。Fisher-Yates shuffle解决了这个问题(来自维基百科的伪代码):
从0到n的i的−2做
J← 随机整数,使我≤ j
您想在这里实现什么?在多次重复之后,条件(IsName==false)看起来不是真的,因此它只是打印出分配给int数组的初始值,即0。我对方法和函数不是很在行。我还是不明白我做错了什么
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("Enter a seed(One letter)");
String input = s.nextLine();
char a = input.charAt(0);
int b = ((int) a) - 96;
Random rnd1 = new Random(b);
int[] letters = fill(rnd1, 26);
System.out.println(Arrays.toString(letters));
}
for(int i = 0; i < 25; i++)
//Your code
}
if (letters[x] == c) {
isSame = true;
}
for i from 0 to n−2 do
j ← random integer such that i ≤ j < n
exchange a[i] and a[j]