如何在 Dart 中生成不重复的随机数?

问题描述 投票:0回答:3

我想生成1-100范围内的随机数,而不是在flutter中重复。当没有更多的数字要生成时(即:1-100 内的每个数字都是随机生成的,没有重复),我想将名为“noNumbersLeft”的布尔值设置为 true。我该怎么做?

dart
3个回答
0
投票
import 'dart:math';

int generateUniqueRandomNumber(numbers, maxNumber){
   int randomNumber = Random().nextInt(maxNumber) + 1;
  
  if(numbers.contains(randomNumber)){
     randomNumber = generateUniqueRandomNumber(numbers, maxNumber);
  }
  return randomNumber;
}

void main() {
  const noOfUniqueNumbersToGenerate = 2;
  const maxNumber = 5;
  List<int> uniqueNumbers = [];

  Stream.periodic(const Duration(seconds: 1))
      .takeWhile((_) => uniqueNumbers.length < noOfUniqueNumbersToGenerate)
      .forEach((e) {
        
        final randomNumber = generateUniqueRandomNumber(uniqueNumbers, maxNumber);
        
        uniqueNumbers.add(randomNumber);      
        print("generated numbers: ${uniqueNumbers.length}");
        
        if(uniqueNumbers.length == noOfUniqueNumbersToGenerate){
          print("genererated numbers list : $uniqueNumbers");
        }
  });
}

-1
投票

正如评论中指出的那样,以前的方法效率低下。我已将其更新为使用

Set
而不是
Map
。但这并不能提高效率。相反,您可以先生成一个包含 1-100 的
List
并对其进行洗牌。然后你从这个打乱的列表中获取值,直到它为空。

final rnList = List<int>.generate(100, (index) => index + 1)..shuffle();

while (rnList.isNotEmpty) {
  final rn = rnList.removeLast();
  // do sth with the number
}

效率低下

这个 while 循环将创建从 1 到 100 的所有数字,而不重复。

final generatedRandoms = <int>{};

final rng = Random();
while (generatedRandoms.length < 100) {
  final gr = rng.nextInt(100) + 1;
  generatedRandoms.add(gr);
}

现在,如果您需要在不同时间生成随机数,例如当用户点击按钮时,方法保持不变。您可以使用集合、映射或数组来跟踪生成的数字。如果号码已经生成,您可以拨打

rng.nextInt
,直到收到尚未生成的号码。一旦你的地图达到 100 长度,就意味着你已经使用了所有地图,然后可以将
noNumbersLeft
设置为 true。


-1
投票
import 'dart:math';

void main() {
  int max = 101;
  int RandomNumber = Random().nextInt(max);
  print(RandomNumber);
}

这应该生成并打印一个从 0 到 100 的随机数。

 import 'dart:math';
    
    void main()  {
int max = 101;
      var rng = new Random();
      for (var i = 0; i < 101; i++) {
        print(rng.nextInt(max ));
      }
    }

不需要设置任何标志(名为“noNumbersLeft”的布尔值)

© www.soinside.com 2019 - 2024. All rights reserved.