【问题标题】:android - generate random numbers with no repeat [duplicate]android - 生成不重复的随机数[重复]
【发布时间】:2011-10-11 11:03:50
【问题描述】:

谁能告诉我如何生成不重复的随机数 例子

随机 (10) 应该(可能)返回 3,4,2,1,7,6,5,8,9,10 且不重复

谢谢

【问题讨论】:

标签: java random


【解决方案1】:

我建议将数字添加到ArrayList<Integer>,然后使用Collections.shuffle() 随机化它们的顺序。像这样的:

ArrayList<Integer> number = new ArrayList<Integer>();
for (int i = 1; i <= 10; ++i) number.add(i);
Collections.shuffle(number);

【讨论】:

  • 喜欢它!一个问题,如果我执行 Collection.Shuffle 两次或三次,它会提供不同的顺序吗?
  • 我很确定它会的。我找不到不应该这样做的理由。很容易检查,是吗? ;)
【解决方案2】:

制作一个生成的数字列表,当你新生成的数字已经在这个列表中时,你就制作一个新的随机数。

Random rng = new Random(); // Ideally just create one instance globally
List<Integer> generated = new ArrayList<Integer>();
for (int i = 0; i < numbersNeeded; i++)
{
    while(true)
    {
        Integer next = rng.nextInt(max) + 1;
        if (!generated.contains(next))
        {
            // Done for this iteration
            generated.add(next);
            break;
        }
    }
}

【讨论】:

  • 不幸的是,这种方法不能很好地扩展
【解决方案3】:

我的两分钱

public Collection<Integer> getRandomSubset(int max,int count){
    if(count > max){
        throw new IllegalArgumentException();
    }
    ArrayList<Integer> list = new ArrayList<Integer>();
    for(int i =  0 ; i < count ;i++){
        list.add(i);
    }       
    Collections.shuffle(list);
    return list.subList(0, count);
}

【讨论】:

  • 我喜欢这个解决方案中的subList() 增强功能 - 非常适合从一副牌中分发一手牌
【解决方案4】:

如果只有几个数字,小于 100,我想我的解决方案可以是创建一个布尔数组,一旦你得到一个数字,将数组的位置设置为 true。我不认为所有数字都出现需要很长时间。希望对您有所帮助!

干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 2012-01-23
    相关资源
    最近更新 更多