如何使随机更准确?

时间:2013-12-16 16:34:42

标签: java

while (tNumbers.size() < 27) {
  int randNum = Helper.random(0, randNumbers.length() - 1);
  tNumbers.add(randNumbers.remove(randNum));
}

randNumbers是从199的数字数组,这里我填充tNumbers数组,直到它有27个元素(数字)。因此,如果randNum多次触发到不存在的密钥,则此代码可能会运行太长时间。

如何使随机更准确?我的意思是让它永远不会错过,并始终在randNumbers中获得现有的密钥。

3 个答案:

答案 0 :(得分:11)

这是一个想法:

  1. 创建1到99之间的数字列表
  2. 使用Collections.shuffle()
  3. 对其进行随机播放
  4. 从中获取前27个元素
  5. 通过执行上述操作,您无需继续生成随机数,直到获得27个元素。这是一个概念证明:

    List<Integer> randomNumbers = new ArrayList<Integer>(99);
    for (int i = 1; i <= 99; i++)
        randomNumbers.add(i);
    Collections.shuffle(randomNumbers);
    List<Integer> random27 = randomNumbers.subList(0, 27);
    

答案 1 :(得分:0)

您已经“永远不会错过”,因为您每次都会以相同的概率随机选择其中一个剩余数字。 List.remove()不会留下空白;在使用该索引调用remove之前,只需get()随机索引处的元素。

while (tNumbers.size() < 27) {
  int randNum = Helper.random(0, randNumbers.length() - 1);
  //both extremes inclusive!
  tNumbers.add(randNumbers.get(randNum));
  randNumbers.remove(randNum);
}

您的Helper.random()函数的分布可能会或可能不准确;你是怎么实现的?

答案 2 :(得分:0)

随机并不意味着唯一,它意味着随机,这意味着它可以随机随机创建相同数量N次。如果你想要唯一的数字,不要使用任何随机的数字,使用一些独特的东西,就像一个完美的哈希函数,保证没有重复。