在 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 中生成唯一的随机数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Dart 中生成大随机数?

在Objective-C中生成唯一数字的随机数?

使用循环在数组中生成唯一的随机数

如何在 django 中生成随机数

在猫鼬数据库中生成唯一的随机数而不重复?

在 Python 3 中生成具有随机长度的类随机唯一字符串的最快方法