生成随机数,但必须使用唯一数字生成而不进行复制

时间:2015-02-07 17:15:12

标签: java random

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,但我不确定应如何实施。

5 个答案:

答案 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次。