PHP 产生m个n范围内的不重复随机数

 

PHP高效产生m个n范围内的不重复随机数(m<=n)

方法一:

<?php

for ($i=1;$i<=52;$i++) {
	$arr[]= $i;
}

shuffle($arr);
print_r($arr);

方法二:

注:在《 Programming Pearls 》一书中也有提到,题目为“如何高效产生m个n范围内的不重复随机数(m<=n)”该算法非常巧妙的取随机数的位置(数组的下标),替代取随机数本身,每次取到一个随机数之后,就将其在取值范围中排除,下一次仅会在剩下的数字中取,一次遍历就可以完成随机数的选取,效率相当高。

<?php

/* 生成52张牌 1,2,3,4,5..52 */
for ($i=1;$i<=52;$i++) {
	$arr[]= $i;
}

function rand_num($num='20'){
	
	for($i=1;$i<=$num;$i++){
		$n[$i] = $i;
	}
	
	for ($i=1;$i<=$num;$i++) {
		
		$rand = mt_rand($i,$num);
		
		if ($n[$i] == $i) {
			$n[$i] = $rand;
			$n[$rand] = $i;
		}
		
	}
	
	return $n;
	
}

echo "<pre>";
print_r(rand_num(count($arr)));

1.第一步,为数组的每个数字按其下标顺序赋值,获得一个 $num 个数字键值对应顺序排列的数组。

2.第二步,开始取范围[ i,$num ]范围内的随机数$rand,并将获取到的随机数$rand作为数组中当前位置 键i对应下标的值$rand,将数组中 键$rand对应下标的值替换为 i,这其实就是数组键值交叉互换。意义是,将已经生成的随机数在取值范围[ i,$num ]中排除,下次会在剩下的数字中[ i+1,num ]取值。

3.第三步,为避免重复取值,只在未改变的键值对中进行交替运算,即在原数组顺序排列 (键==值) 的位置进行交替运算。

4.结束。

--------------------- 原作者:KShame 来源:CSDN 原文:https://blog.csdn.net/llfdhr/article/details/53330841?utm_source=copy

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用Qt提供的QRandomGenerator类来生成随机数,并使用QSet类来存储生成的随机数,确保不会产生重复随机数。以下是一个示例代码: ```c++ #include <QSet> #include <QRandomGenerator> QSet<int> generateRandomNumbers(int count, int minValue, int maxValue) { QSet<int> randomNumbers; QRandomGenerator randomGenerator; randomGenerator.seed(QDateTime::currentMSecsSinceEpoch()); // 设置随机数生成器的种子为当前时间 while (randomNumbers.count() < count) { int randomNumber = randomGenerator.bounded(minValue, maxValue + 1); // 生成[minValue, maxValue]范围内的随机整数 randomNumbers.insert(randomNumber); // 将随机数插入到集合 } return randomNumbers; } ``` 使用示例: ```c++ QSet<int> randomNumbers = generateRandomNumbers(5, 1, 10); foreach(int number, randomNumbers) { qDebug() << number; } ``` 该函数将生成5个范围在1到10之间的不重复随机整数,并将其存储在QSet返回。 ### 回答2: 在Qt,可以使用QRandomGenerator类来生成随机数。要生成一组指定范围内的不重复随机数,可以借助QSet容器来实现。 首先,创建一个QSet对象,用于存储已生成的随机数。然后,使用QRandomGenerator::global()->bounded()函数来生成一个随机数,并将其添加到QSet。如果生成的随机数已经存在于QSet,则重新生成一个。重复这个步骤,直到生成指定数量的不重复随机数为止。 以下是一个示例代码: ```cpp #include <QRandomGenerator> #include <QSet> QSet<int> generateUniqueRandomNumbers(int min, int max, int count) { QSet<int> randomNumbers; while (randomNumbers.size() < count) { int randomNumber = QRandomGenerator::global()->bounded(min, max + 1); randomNumbers.insert(randomNumber); } return randomNumbers; } int main() { int min = 1; // 指定范围的最小值 int max = 100; // 指定范围的最大值 int count = 10; // 需要生成的随机数数量 QSet<int> randomNumbers = generateUniqueRandomNumbers(min, max, count); for (int randomNumber : randomNumbers) { qDebug() << randomNumber; } return 0; } ``` 上述代码,generateUniqueRandomNumbers()函数接受三个参数:指定范围的最小值、最大值和需要生成的随机数数量。函数内部使用while循环不断生成随机数,并将其添加到QSet,直到QSet的大小达到指定数量为止。最后,将生成的随机数依次打印出来。 注意,需要在项目文件添加QT += core以包含QtCore模块的头文件,并在代码包含相关的头文件。此外,示例代码使用了QDebug来输出随机数,因此还需添加QT += debug。 以上就是在Qt随机产生一组指定范围内的不重复随机数的方法。 ### 回答3: 在Qt,可以使用QRandomGenerator类来生成随机数。要生成一组指定范围内的不重复随机数,可以采用以下步骤: 1. 引入QRandomGenerator类:首先在代码引入QRandomGenerator类,可以通过#include <QRandomGenerator>来实现。 2. 设置种子:使用QRandomGenerator类的global()静态成员函数来获取全局的QRandomGenerator对象。可以使用其seed()函数设置种子值,以保证每次运行生成的随机数序列是不同的。 3. 生成随机数序列:可以使用QList或QSet容器来存储生成的随机数。首先创建一个空的QList或QSet对象,用于存储随机数。然后使用QRandomGenerator类的bounded()函数生成指定范围内的随机数,并将其添加到QList或QSet。 4. 检查重复:在每次生成随机数时,可以使用contains()函数来检查当前生成的随机数是否已经存在于QList或QSet,若不存在则将其添加到容器。这样可以保证生成的随机数重复。 5. 生成指定数量的随机数:根据需求,可以使用循环来重复步骤3和步骤4,直到生成指定数量的随机数。 以下是一个示例代码,用于生成指定范围内的不重复随机数: ```cpp #include <QRandomGenerator> #include <QList> QList<int> generateRandomNumbers(int min, int max, int count) { QList<int> randomNumbers; QRandomGenerator* generator = QRandomGenerator::global(); generator->seed(QTime::currentTime().msec()); while (randomNumbers.count() < count) { int randomNumber = generator->bounded(min, max+1); if (!randomNumbers.contains(randomNumber)) randomNumbers.append(randomNumber); } return randomNumbers; } ``` 在上述示例代码,generateRandomNumbers函数接收三个参数:最小值min、最大值max和要生成的随机数的数量count。函数返回一个QList<int>类型的随机数序列。 通过调用该函数,即可生成一组指定范围内的不重复随机数。例如: ```cpp int main(int argc, char *argv[]) { QList<int> randomNumbers = generateRandomNumbers(1, 10, 5); foreach (int randomNumber, randomNumbers) { qDebug() << randomNumber; } return 0; } ``` 上述代码生成了5个位于1到10之间的不重复随机数,并使用qDebug()函数输出到控制台。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值