在 Dart 中生成唯一的随机数
Posted
技术标签:
【中文标题】在 Dart 中生成唯一的随机数【英文标题】:Generate unique random numbers in Dart 【发布时间】:2019-08-26 11:43:23 【问题描述】:如何在 dart 中生成两个不同的随机数?
我使用下面的代码生成了两个随机数。
int rand1 = Random().nextInt(16);
int rand2 = Random().nextInt(16);
if(rand1 == rand2)
// generate new random
在rand1 != rand2
之前如何生成新的随机数?
【问题讨论】:
使用do-while
循环..
在最一般的情况下,当您希望从一组 M 中随机选择 N 个不同的数字(其中 N
【参考方案1】:
如果您需要在固定范围内有两个不同随机数,那么最简单的方法是:
var random = Random();
var n1 = random.nextInt(16);
var n2 = random.nextInt(15);
if (n2 >= n1) n2 += 1;
这确保了第一个数字可以假定所有 16 个值,第二个数字可以假定其余 15 个值中的任何一个,并且在随机生成器允许的情况下具有尽可能均匀的分布。
对于 0..15 范围内的两个有序的不同数字,有 16 * 15 个可能的结果,您可能希望每个结果的概率相同。 此代码通过随机选择第一个数字来实现这一点,然后通过确保它在范围 [0 .. (n1 - 1)] 或范围内来选择第二个数字作为与第一个不同的数字之一[(n1 + 1) .. 15] ... 通过在 [0 .. 14] 范围内选择一个数字并在 >= n1 时加一,将范围 [n1 .. 14] 移动到 [(n1 + 1) .. 15].
你可以这样做以获得更多的数字,但你必须做更多的测试和添加。
【讨论】:
不知道你为什么被否决,但这是迄今为止两个结果的最佳答案。 你能详细解释一下吗? 这类似于 Floyd 的算法,尽管后者更好地推广到 N>2。【参考方案2】:我建议您采用不同的方法,循环可能会很痛苦。
// create a list say of 16 numbers.
List list = List.generate(16, (i) => i);
// shuffle it
list.shuffle();
// take the numbers now, they are always unique
int firstRandonNum = list[0];
int secondRandonNum = list[1];
【讨论】:
如果所需元素的数量相对于所涉及的范围很大,这是一个不错的选择,但是当范围很大并且绘制的数量很少时,这是非常浪费资源的。对于此示例,接受/拒绝将抽取 1 + 16/15 = 2.0666... 平均随机数,而洗牌将需要 15 个随机数和交换。【参考方案3】:从许多中提取许多(例如,从数千个中提取 50 个)的潜在解决方案是使用哈希集循环和记忆。
我从我的代码中提取了这个,但类似于:
var hashSet = HashSet();
for (var i = 0; i < boardSize; i++)
words.add([]);
for (var j = 0; j < boardSize; j++)
Random _random = new Random();
String wordToAdd = abstractPossibleWords[_random.nextInt(abstractPossibleWords.length)];
while (hashSet.contains(wordToAdd))
wordToAdd = abstractPossibleWords[_random.nextInt(abstractPossibleWords.length)];
words[i].add(wordToAdd);
【讨论】:
【参考方案4】:生成 0-49 范围内的任意 5 个唯一随机数
List<int> numberList=[];
Random random = new Random();
while(numberList.length<5)
int random_number = randomizer.nextInt(50);
if (!numberList.contains(random_number))
numberList.add(random_number);
【讨论】:
【参考方案5】:这是最简单的方法:
import 'dart:math';
void main()
int rand1 = Random().nextInt(16);
int rand2 = Random().nextInt(16);
while(rand1 == rand2)
rand1 = Random().nextInt(16);
rand2 = Random().nextInt(16);
print('$rand1 $rand2');
【讨论】:
【参考方案6】:也许对你有用。
'max' 是独占的。唯一的结果编号在返回列表中。
List<int> getRandomNums(int countOfNum, int max)
int num = 0;
List<int> numList = [];
var random = Random();
int i = 0;
while ( i < countOfNum)
int oldNum = num;
num = random.nextInt(max);
if (numList.contains(num)) continue;
numList.add(num);
i++;
return numList;
【讨论】:
以上是关于在 Dart 中生成唯一的随机数的主要内容,如果未能解决你的问题,请参考以下文章