int[] drawNumbers = new int[10];//Array With 10 Random Numbers USED for DRAWN NUMBERS
String x = "Drawn Numbers: ";
List<Ticket> ticketWon ;
do{
//GENERATING 10 Random Numbers
for (int i = 0; i <= drawNumbers.length -1 ; i++) {
Random r = new Random();
drawNumbers[i] = r.nextInt(99) + 1;
x += drawNumbers[i] + " ";
}
}
我正在尝试生成10个随机数,这些数字必须是随机生成的并且是唯一的。我的问题是Random r = new Random()
有时会显示复制的数字。如何在没有重复的情况下从1到99生成10个随机数?
问题在于彩票系统
我想使用Collection.Shuffle
,但我不确定应如何实施。
答案 0 :(得分:5)
这是实现所需结果的另一种方法。我们使用值1到99填充列表。然后我们将列表洗牌并获取前10个值:
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i=1; i<100; i++) {
list.add(new Integer(i));
}
Collections.shuffle(list);
for (int i=0; i<10; i++) {
System.out.println(list.get(i));
}
}
您不必导入/直接处理Random
,这是一个加号。但是,正如@Voicu所指出的那样(在评论中),shuffle
确实利用了随机性:
public static void shuffle(List<?> list) {
if (r == null) {
r = new Random();
}
shuffle(list, r);
}
private static Random r;
答案 1 :(得分:1)
我生成随机数并将其保存到Set
,直到我得到10个数字。然后从中创建一个列表,将其洗牌,然后从中获取数字。
final int NUMBERS_TO_DRAW = 10;
Random r = new Random();
// Generate NUMBERS_TO_DRAW random numbers
Set<Integer> randoms = new HashSet<>();
while (randoms.size() < NUMBERS_TO_DRAW) {
randoms.add(r.nextInt(99) + 1);
}
// Now shuffle them:
List<Integer> shuffledRandom = new ArrayList<>(randoms);
Collections.shuffle(shuffledRandom);
编辑:
正如@MarkPeters在评论中指出的那样,使用LinkedHashSet
将消除随机播放的需要:
final int NUMBERS_TO_DRAW = 10;
Random r = new Random();
// Generate NUMBERS_TO_DRAW random numbers
LinkedHashSet<Integer> randoms = new LinkedHashSet<>();
while (randoms.size() < NUMBERS_TO_DRAW) {
randoms.add(r.nextInt(99) + 1);
}
答案 2 :(得分:1)
你可以将这个问题广泛地认为是有一副卡片编号从1到99,而你想挑选其中10张卡片。解决方案是以编程方式创建该套牌,然后从该套牌中随机选择并从套牌中移除。
我们可以将套牌建模为整数列表,并用1到99之类的条目填充该List:
List<Integer> deck = new ArrayList<Integer>();
for( int i=1; i<=99; i++ ){
deck.add( i );
}
然后我们需要在第0张卡片之间挑选一张随机卡片(列表从0开始编号)和列表中的元素数量:
int draw = r.nextRandom( deck.size() );
Integer card = deck.remove( draw );
重复那10次,用&#34;卡&#34; (比如说,将它放入数组,或其他列表,或其他任何内容:
int drawNumbers = new int[10];
for( int co=0; co<10; co++ ){
int draw = r.nextRandom( deck.size() );
Integer card = deck.remove( draw );
drawNumbers[co] = card;
}
答案 3 :(得分:1)
使用Set<Integer>
。
Set<Integer> set = new HashSet<Integer>();
int[] drawNumbers = new int[10];
Random r = new Random();
for(int i=0; i<10; i++)
{
drawNumbers[i] = r.nextInt(99) + 1;
while(set.contains(drawNumbers[i]))
drawNumbers[i] = r.nextInt(99) + 1;
set.add(drawNumbers[i]);
}
答案 4 :(得分:0)
使用list
会更容易,因此您可以检查它是否已包含该数字并重新生成(如果有)。
List<Integer> drawNumbers = new ArrayList<Integer>();
Random r = new Random();
int newNumber = -1;
do
{
newNumber = r.nextInt(99) + 1;
} while(drawNumbers.contains(newNumber); //Make sure the number is not already in the list.
然后把它放在循环中重复10次。