生成除特定值之外的随机数

我想生成随机数,但不希望它们来自excludeRows数组。 这是我的代码。

 public int generateRandom(int start, int end, ArrayList excludeRows) { Random rand = new Random(); int range = end - start +1 - excludeRows.size(); int random = rand.nextInt(range) + 1; for(int i = 0; i  random) { return random; } random++; } return random; } 

我在while循环中使用此函数,并在每次迭代期间向excludeRows添加一个新值。 有时它会返回属于excludeRows数字。 有什么问题?

 if(!exclude.contains(random)) return random; 

每次返回未排除的值时尝试此操作。

我认为有一些错误。

1)范围应该是结束 – 开始+ 1,因为这是所需的范围。
2)如果你真的想要随机数(在计算机上尽可能“随机”),那么你不应该只获得下一个可用数字。 因为在这种情况下,您的随机数将具有排除数字密度/频率的特征。

 public int generateRandom(int start, int end, ArrayList excludeRows) { Random rand = new Random(); int range = end - start + 1; int random; boolean success = false; while(!success) { random = rand.nextInt(range) + 1; for(Integer i: excludeRows) { if(i == random) { break; } else if (i > random) { success = true; break; } } } return random; } 

UPDATE

有了Achintya Jha的答案我的代码可以改进(但请注意也有一些评论):

 public int generateRandom(int start, int end, ArrayList excludeRows) { Random rand = new Random(); int range = end - start + 1; int random = rand.nextInt(range) + 1; while(excludeRows.contains(random)) { random = rand.nextInt(range) + 1; } return random; } 

你检查:

 for(int i = 0; i < exclude.size(); i++) { if(exclude.get(i) > random) { return random; } 

如果只有第一个更大,您将返回该值。 你确定exclude吗?

您可以使用if(exclude.contains(random ))或以下算法:

如果(end-start)是一个合理的数字,并且您需要几乎所有值,您可以创建所有可接受数字的列表并在此列表大小上使用随机值并选择随机值作为索引。 然后从列表中删除不需要的数字,并获得另一个随机索引。

实际上,我们不需要使用while contains(random)和while循环。

为简化问题,让我们看看如果我们只有一个排除值会发生什么。 我们可以将结果分成2部分。 然后可能的值的数量是range-1 。 如果随机数小于排除值,则返回它。 否则,我们可以加1

对于多个排除值,我们可以将结果集拆分为size+1部分,其中size表示排除值的数量。 然后可能的值的数量是range-size 。 然后我们按升序排序值排序。 如果随机数小于排除值减去i ,那么我们只返回随机数add i ,其中i是排除值的索引。

 public int generateRandomNumberWithExcepts(int start, int end, List excepts) { int size = excepts.size(); int range = end - start + 1 - size; int randNum = random.nextInt(range) + start; excepts.sort(null); // sort excluding values in ascending order int i=0; for(int except : excepts) { if(randNum < except-i){ return randNum + i; } i++; } return randNum + i; }