我如何避免在我的 Int 数组中得到相同的数字?
How do i avoid getting same number in my Int Array?
嗨,我如何避免在我的代码中出现重复的 "lottery ticket"?
现在的问题是一切正常,排序、随机数、将其变成字符串。
问题是,如果我想要 5 张彩票,我将打印出 5 张彩票
示例
Lottery tickets:
--------------
[5, 13, 18, 22, 23, 23, 30]
[4, 7, 10, 12, 16, 26, 32]
[3, 5, 9, 22, 23, 25, 34]
[4, 5, 15, 18, 19, 19, 26]
[3, 3, 12, 14, 23, 26, 35] (Duplicate 3)
[5, 6, 12, 13, 14, 15, 26]
如您所见,有重复的数字,我想避免这种情况,所以它总是随机的。我该如何避免这种情况?
import java.util.Arrays;
import java.util.Scanner;
public class Alt2 {
public static void main(String[] args) {
System.out.print("How many lottery tickets do u want?: \n");
Scanner svar= new Scanner(System.in);
int nr = svar.nextInt();
System.out.println("Lottery tickets: ");
System.out.println("--------------");
for(int i=0; i<nr; i++)
{
Alt2 t = new Alt2();
int[] lottoNummer = t.BubbleSort();
System.out.print(Arrays.toString(lottoNummer));
System.out.println();
svar.close();
}
}
private int[] getTicket(){
int[] lottoNummer = new int[7];
lottoNummer[0] = (int) ((35 * Math.random()) + 1);
lottoNummer[1] = (int) ((35 * Math.random()) + 1);
lottoNummer[2] = (int) ((35 * Math.random()) + 1);
lottoNummer[3] = (int) ((35 * Math.random()) + 1);
lottoNummer[4] = (int) ((35 * Math.random()) + 1);
lottoNummer[5] = (int) ((35 * Math.random()) + 1);
lottoNummer[6] = (int) ((35 * Math.random()) + 1);
return lottoNummer;
}
public int[] BubbleSort( )
{
int j;
boolean flag = true;
int temp;
Alt2 t = new Alt2();
int[] lottoNummer = t.getTicket();
while ( flag )
{
flag= false;
for( j=0; j < lottoNummer.length -1; j++ )
{
if ( lottoNummer[ j ] > lottoNummer[j+1] )
{
temp = lottoNummer[ j ];
lottoNummer[ j ] = lottoNummer[ j+1 ];
lottoNummer[ j+1 ] = temp;
flag = true;
}
}
}
return lottoNummer;
}
}
您可以将排序后的数字 1 到 35 放入 arrayList 中,将它们打乱顺序,然后从列表中取出前 7 个数字。
//define ArrayList to hold Integer objects
ArrayList<Integer> numbers = new ArrayList<Integer>();
for(int i = 0; i < 35; i++)
{
numbers.add(i+1);
}
Collections.shuffle(numbers);
这个怎么样:
用 1 到 35 的整数创建一个数组列表:
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 36; i++) {
list.add(new Integer(i));
}
然后从此列表中抽取一个随机数,并将其从列表中删除:
lottoNummerIndex = (int) ((35 * Math.random()) + 1);
lottoNummer[0] = list.get(lottoNummerIndex);
list.remove(lottoNummerIndex);
从剩余列表中抽取下一个数字:
lottoNummerIndex = (int) ((34 * Math.random()) + 1);
lottoNummer[1] = list.get(lottoNummerIndex);
list.remove(lottoNummerIndex);
重复此操作直到:
lottoNummerIndex = (int) ((29 * Math.random()) + 1);
lottoNummer[6] = list.get(lottoNummerIndex);
list.remove(lottoNummerIndex);
现在您的数组 lottoNummer 包含 7 个不同的号码。
我建议在开始时创建一个大小为 0 的 int 数组。然后,进行一个循环以生成您的随机数,另一个内部循环通过数组 运行 并检查随机数是否已经存在。如果是,则将主循环索引减 1。如果不是,则创建一个大小为主数组 + 1 的临时数组,进行主数组大小的循环,将值传输到临时数组并从循环将最后一个随机数添加到主数组的长度索引中。
举个例子:
int[] nums = new int[0];
Random rnd = new Random();
for (int i = 0; i < 30; i++)
{
bool dup = false;
int rand = rnd.Next(1, 99);
for (int j = 0; j < nums.Length; j++)
{
if (nums[j] == rand)
{
i--;
dup = true;
break;
}
}
if (!dup)
{
int[] tmp = new int[nums.Length+1];
for (int j = 0; j < nums.Length; j++)
tmp[j] = nums[j];
tmp[nums.Length] = rand;
nums = tmp;
}
}
未经测试,我刚写的。希望对你有帮助。
@Edward Orlowski
所以我得到一个错误
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 36; i++) {
list.add(new Integer(i));
}
lottoNummer[0] = (int) ((35 * Math.random()) + 1);
list.remove(lottoNummer[0]);
lottoNummer[1] = (int) ((35 * Math.random()) + 1);
list.remove(lottoNummer[1]);
lottoNummer[2] = (int) ((35 * Math.random()) + 1);
list.remove(lottoNummer[2]);
lottoNummer[3] = (int) ((35 * Math.random()) + 1);
list.remove(lottoNummer[0]);
lottoNummer[4] = (int) ((35 * Math.random()) + 1);
list.remove(lottoNummer[4]);
lottoNummer[5] = (int) ((35 * Math.random()) + 1);
list.remove(lottoNummer[5]);
lottoNummer[6] = (int) ((35 * Math.random()) + 1);
list.remove(lottoNummer[6]);
嗨,我如何避免在我的代码中出现重复的 "lottery ticket"?
现在的问题是一切正常,排序、随机数、将其变成字符串。 问题是,如果我想要 5 张彩票,我将打印出 5 张彩票
示例
Lottery tickets:
--------------
[5, 13, 18, 22, 23, 23, 30]
[4, 7, 10, 12, 16, 26, 32]
[3, 5, 9, 22, 23, 25, 34]
[4, 5, 15, 18, 19, 19, 26]
[3, 3, 12, 14, 23, 26, 35] (Duplicate 3)
[5, 6, 12, 13, 14, 15, 26]
如您所见,有重复的数字,我想避免这种情况,所以它总是随机的。我该如何避免这种情况?
import java.util.Arrays;
import java.util.Scanner;
public class Alt2 {
public static void main(String[] args) {
System.out.print("How many lottery tickets do u want?: \n");
Scanner svar= new Scanner(System.in);
int nr = svar.nextInt();
System.out.println("Lottery tickets: ");
System.out.println("--------------");
for(int i=0; i<nr; i++)
{
Alt2 t = new Alt2();
int[] lottoNummer = t.BubbleSort();
System.out.print(Arrays.toString(lottoNummer));
System.out.println();
svar.close();
}
}
private int[] getTicket(){
int[] lottoNummer = new int[7];
lottoNummer[0] = (int) ((35 * Math.random()) + 1);
lottoNummer[1] = (int) ((35 * Math.random()) + 1);
lottoNummer[2] = (int) ((35 * Math.random()) + 1);
lottoNummer[3] = (int) ((35 * Math.random()) + 1);
lottoNummer[4] = (int) ((35 * Math.random()) + 1);
lottoNummer[5] = (int) ((35 * Math.random()) + 1);
lottoNummer[6] = (int) ((35 * Math.random()) + 1);
return lottoNummer;
}
public int[] BubbleSort( )
{
int j;
boolean flag = true;
int temp;
Alt2 t = new Alt2();
int[] lottoNummer = t.getTicket();
while ( flag )
{
flag= false;
for( j=0; j < lottoNummer.length -1; j++ )
{
if ( lottoNummer[ j ] > lottoNummer[j+1] )
{
temp = lottoNummer[ j ];
lottoNummer[ j ] = lottoNummer[ j+1 ];
lottoNummer[ j+1 ] = temp;
flag = true;
}
}
}
return lottoNummer;
}
}
您可以将排序后的数字 1 到 35 放入 arrayList 中,将它们打乱顺序,然后从列表中取出前 7 个数字。
//define ArrayList to hold Integer objects
ArrayList<Integer> numbers = new ArrayList<Integer>();
for(int i = 0; i < 35; i++)
{
numbers.add(i+1);
}
Collections.shuffle(numbers);
这个怎么样:
用 1 到 35 的整数创建一个数组列表:
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 36; i++) {
list.add(new Integer(i));
}
然后从此列表中抽取一个随机数,并将其从列表中删除:
lottoNummerIndex = (int) ((35 * Math.random()) + 1);
lottoNummer[0] = list.get(lottoNummerIndex);
list.remove(lottoNummerIndex);
从剩余列表中抽取下一个数字:
lottoNummerIndex = (int) ((34 * Math.random()) + 1);
lottoNummer[1] = list.get(lottoNummerIndex);
list.remove(lottoNummerIndex);
重复此操作直到:
lottoNummerIndex = (int) ((29 * Math.random()) + 1);
lottoNummer[6] = list.get(lottoNummerIndex);
list.remove(lottoNummerIndex);
现在您的数组 lottoNummer 包含 7 个不同的号码。
我建议在开始时创建一个大小为 0 的 int 数组。然后,进行一个循环以生成您的随机数,另一个内部循环通过数组 运行 并检查随机数是否已经存在。如果是,则将主循环索引减 1。如果不是,则创建一个大小为主数组 + 1 的临时数组,进行主数组大小的循环,将值传输到临时数组并从循环将最后一个随机数添加到主数组的长度索引中。
举个例子:
int[] nums = new int[0];
Random rnd = new Random();
for (int i = 0; i < 30; i++)
{
bool dup = false;
int rand = rnd.Next(1, 99);
for (int j = 0; j < nums.Length; j++)
{
if (nums[j] == rand)
{
i--;
dup = true;
break;
}
}
if (!dup)
{
int[] tmp = new int[nums.Length+1];
for (int j = 0; j < nums.Length; j++)
tmp[j] = nums[j];
tmp[nums.Length] = rand;
nums = tmp;
}
}
未经测试,我刚写的。希望对你有帮助。
@Edward Orlowski
所以我得到一个错误
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 36; i++) {
list.add(new Integer(i));
}
lottoNummer[0] = (int) ((35 * Math.random()) + 1);
list.remove(lottoNummer[0]);
lottoNummer[1] = (int) ((35 * Math.random()) + 1);
list.remove(lottoNummer[1]);
lottoNummer[2] = (int) ((35 * Math.random()) + 1);
list.remove(lottoNummer[2]);
lottoNummer[3] = (int) ((35 * Math.random()) + 1);
list.remove(lottoNummer[0]);
lottoNummer[4] = (int) ((35 * Math.random()) + 1);
list.remove(lottoNummer[4]);
lottoNummer[5] = (int) ((35 * Math.random()) + 1);
list.remove(lottoNummer[5]);
lottoNummer[6] = (int) ((35 * Math.random()) + 1);
list.remove(lottoNummer[6]);