C++中随机数和不重复的随机数
随机数
int rand ();
rand函数返回一个0-32767之间的一个伪随机整数,32767可以由宏RAND_MAX表示,该函数需要头文件<stdlib.h>。
常用的是如何生成一个范围内的随机数,例如想生成0-100之间的随机数,那么我们可以编写如下语句:
#include <stdlib.h>
#include <iostream> using namespace std; void RAND(int max, int min, int n)
{
for(int i = ; i < n; ++i)
{
int u = (double)rand() / (RAND_MAX + ) * (max - min) + min;
cout << u << " ";
}
}
第10行是关键,rand()生成一个随机数,通过一系列简单的数学计算将随机范围变到min与max之间。需要注意的是,将rand转化为double类型之后是保证在做除法时得到有效地数字,最后因为u声明为int类型,最后可以保证得到的是整数序列。参数n是随机数的个数。生成0-100的10个随机数的语句为
RAND(, , );
结果如图,但是这样每次生成的随机数都相同,因此我们需要一种方法来生成不同的随机数。srand()函数用以设定随机数种子,我们知道随机数的产生实际上是从一个伪随机数列中取值,我们通过设置随机数种子,即可以从该伪随机数列的不同位置取值,显示出来就达到了更新随机数的目的。
void srand( unsigned int seed );
里面接受一个int数值,一般采取的方式是根据当前系统时间来产生一个数值,用该数值来作为随机数种子,需要头文件<time.h>。
void RAND(int max, int min, int n)
{
srand(time(NULL));
for (int i = ; i < n; i++)
{
int u = (double)rand() / (RAND_MAX + ) * (max - min) + min;
cout << u << " ";
}
}
第三行便更新了随机数种子,得到结果为 ,可以看出随机数有了更新。
不重复随机数
从第二次运行的结果来看,我们发现产生了两个90,如果我们想要避免这种情况,即产生的随机数不会重复,那么该如何进行代码的编写?
最初的思想是每生成一个随机数,便于前面的所有随机数进行比较,如果有重复,则舍去不要,重新选取。但该方法十分费时,并且在数据量巨大的并且有一定限制的时候,会引发巨大问题。例如要生成10000个随机数,范围是0-9999,且不能重复,那么最后几个随机数有可能需要相当长的时间才能筛选出来。
下面我们从另外一个角度来思考,假设我们已经由一个数组长度为10000的数组,里面分别存储了数据0-9999,我现在的做法是想办法让10000个数进行随机排列,便得到了这样一个随机数列,如果我只要其中的100个数,那么从前面取出100个就好。这里利用algorithm.h里面的一个函数,,来进行简单处理。
template<class RandomAccessIterator>
void random_shuffle(
RandomAccessIterator _First,
RandomAccessIterator _Last
);
这个函数操作的对象是容器的迭代器,即我们需要将存储数据从数组变为容器就好了,下面代码实现一下:
#include <algorithm>
#include <iostream>
#include <vector> using namespace std; void randperm(int Num)
{
vector<int> temp;
for (int i = ; i < Num; ++i)
{
temp.push_back(i + );
} random_shuffle(temp.begin(), temp.end()); for (int i = ; i < temp.size(); i++)
{
cout << temp[i] << " ";
}
} cout << endl;
给函数传10为,参数,即生成一个从1-10的不重复随机数,结果为:。
上面的方式只是一种,还有很多方式用以产生不重复随机数,有兴趣的朋友可以参考一下下面的连接:
http://www.hoopercao.com/2011/01/23/%E7%94%9F%E6%88%90%E4%B8%8D%E9%87%8D%E5%A4%8D%E7%9A%84%E9%9A%8F%E6%9C%BA%E6%95%B0%E7%9A%84%E6%96%B9%E6%B3%95/
http://www.cnblogs.com/afarmer/archive/2011/05/01/2033715.html
http://www.cnblogs.com/zuisanlang/archive/2011/12/09/2282960.html
C++中随机数和不重复的随机数的更多相关文章
- 论 Java 中获取一组不重复的随机数之性能问题
今天在做一个Java项目, 用到了使用一组不重复的随机数问题, 不管怎么做随机数里面总有几个是重复的. 于是上网去找资料, 在网上找到的资料中大部分都是一个思路: 网上的思路一:(性能不理想) 先生成 ...
- 使用C++生成1-33中的6个随机数,无重复
生成1-33中的6个随机数,无重复 ------------------------------------------------------------------------ 方法1.每生成 ...
- JAVA中获取不重复的随机数
我们知道 Random random = new Random() 中可能会获取到重复的随机数 那么假设要获取1到33之间的六个不重复随机数应该怎么做呢? 首先定义一个数字数组存储1到33 int[ ...
- C#生成不重复的随机数(转)
我们在做能自动生成试卷的考试系统时,常常需要随机生成一组不重复随机数的题目,在.net Framework中提供了一个专门用来产生随机数的类System.Random. 对于随机数,大家都知道,计算机 ...
- C#生成不重复的随机数
在做能自动生成试卷的考试系统时,常常需要随机生成一组不重复的题目,在.net Framework中提供了一个专门用来产生随机数 http://www.jbxue.com/tags/suijishu.h ...
- PHP函数:生成N个不重复的随机数
思路:将生成的随机数存入数组,再在数组中去除重复的值,即可生成一定数量的不重复随机数. 程序: <?php /* * array unique_rand( int $min, int $max, ...
- C#产生不重复的随机数并生成随机文件名
本文转自:http://blog.ciznx.com/post/csharprandomnumberandrandomfilename.aspx 在项目中会遇到需要批量生成文件的时候,比如 asp.n ...
- JavaScript 不重复的随机数
在 JavaScript 中,一般产生的随机数会重复,但是有时我们需要不重复的随机数,如何实现?本文给于解决方法,需要的朋友可以参考下 在 JavaScript 中,一般产生的随机数会重复,但 ...
- 生成N个不重复的随机数(转)
有25幅作品拿去投票,一次投票需要选16幅,单个作品一次投票只能选择一次.前面有个程序员捅了漏子,忘了把投票入库,有200个用户产生的投票序列为空.那么你会如何填补这个漏子? 当然向上级反映情况.但是 ...
随机推荐
- 理解javascript this指向
匿名函数中的this指向window对象 这句话很经典: 每个函数在调用时,其活动对象都会自动获取两个特殊的变量:this和arguments.内部函数在搜索这两个变量时,只会搜到其活动对象为止,因此 ...
- iOS7时代我们用什么来追踪和识别用户?
要识别用户,首先就是要选择一个标识符,通过这个标识符来识别这个用户的设备(而不是用户),这个标识符要能够保证一个设备上返回的值是一样的,并且在其他设备上不会出现相同的值. 在iOS7之前,曾经有过很多 ...
- ElasticSearch-5.0.0安装中文分词插件IK
Install IK 源码地址:https://github.com/medcl/elasticsearch-analysis-ik,git clone下来. 1.compile mvn packag ...
- 第一次作业——subway
作业源程序代码:https://github.com/R-81/subway 作业程序使用说明:通过输入命令参数求解路线(仅支持-b,-c),根据参数得出路线后,程序不会结束,此时可输入地铁路线名(例 ...
- kettle参数、变量详细讲解[转]
kettle 3.2 以前的版本里只有 variable 和 argument,kettle 3.2 中,又引入了 parameter 概念:variable 即environment variabl ...
- Beanutils基本用法
Beanutils用了魔术般的反射技术,实现了很多夸张有用的功能,都是C/C++时代不敢想的.无论谁的项目,始终一天都会用得上它.我算是后知后觉了,第一回看到它的时候居然错过. 1.属性的动态gett ...
- asp.net core 使用EF7 Code First 创建数据库,同时使用命令创建数据库
1.首先下载vs2015的Asp.Net Core(RC2)的插件工具(https://www.microsoft.com/net/core#windows)2.创建一个asp.net Core的项目 ...
- php 去掉字符串的最后一个字符
原字符串1,2,3,4,5,6, 去掉最后一个字符",",最终结果为1,2,3,4,5,6 代码如下: $str = "1,2,3,4,5,6,"; $news ...
- Backbone 学习笔记
Backbone 是一款基于模型-视图-控制器 MVC 模式的轻量级javascript 框架 ,可以用来帮助开发人员创建单页Web应用. 借助Backbone 我们可以使用REST的方式来最小化客户 ...
- 群里分享的react的收藏一下!今日周末,改了个表单验证然后无所事事了!
今日周末,改了个表单验证然后无所事事了,然后把昨天群里分享的react的收藏一下尽管现在还在研究angular和nodeJs毕竟刚刚开始用有点不熟...没准以后会研究一下react毕竟看着下面这张图还 ...