我想生成1-100范围内的随机数,而不是在flutter中重复。当没有更多的数字要生成时(即:1-100 内的每个数字都是随机生成的,没有重复),我想将名为“noNumbersLeft”的布尔值设置为 true。我该怎么做?
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");
}
});
}
正如评论中指出的那样,以前的方法效率低下。我已将其更新为使用
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。
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”的布尔值)