[C++]对随机数的一点感悟

原创 2018年04月15日 14:27:11
        每次用到随机数的时候都会记不清随机数具体的用法,那么自己今天就来好好的总结一下。

伪随机数

        首先,介绍一下伪随机数:

rand()
        此函数所生成的随机数每次运行都是固定的数字,另外,如果需要生成特定范围的伪随机数,那么就需要用到:

rand() % n + x ;
        比如想要生成1-10的随机数,那么 n=10 , x =1

rand() % 10 + 1 ;


TIME函数

        如果想要引入真正的随机数,那么就需要知道time函数,在c++中需要引入头文件ctime ( c 中为time.h)

#include<ctime>
        在使用时,time存在一个参数,一般设置为0,如果设置为1或者其他整数值,会产生无法转换类型的错误,time函数实际为:

static __inline time_t __CRTDECL time(time_t * _Time)
{
    return _time64(_Time);
}

        time里实际存放了指向当前时间的指针,内容表示当前时间到1970年1月1日 0点 到现在的秒数。

#include<iostream>
#include<ctime>
using namespace std;
int main(){
    cout << " time(NULL): ";
    cout << time(NULL) << endl;  //15237700651523770065152377006515237700651523770065 是一个很大的数了
    return 0;
}

真随机数

        由于版本不同,有的编译器可能需要引入<cstdlib>头文件。
        存在一个srand()函数,带有一个参数seed作为种子,控制rand() 产生真正的随机数。当然,如果seed相同的话,产生的rand()肯定也是相同的。

#include<iostream>
#include<cstdlib> // it depends your IDE
#include<ctime>
using namespace std;
int main(){ 
    srand((unsigned)time(NULL)); 
    for (int i = 0; i < 5; i++) 
        cout << rand() << endl; // 9135 13415 14086 27845 16095
    return 0;
}

        那么问题来了,如何保证seed不同呢,有没有一种东西可以记录并且随时在变化呢,对了,那就是时间。由于时间一直都在变化的特性,我们可以使用时间作为seed,来产生真正的随机数。

产生自定义范围的随机数

        当我们知道如何产生随机数以后,结合之前谈到的产生自定义范围的伪随机数,我们同样可以用取模运算,来获取到自己需要范围的数字。

        例如,我们想要获取1-10之间的随机数

#include<iostream>
#include<cstdlib>  // it depends your IDE
#include<ctime>
using namespace std;
int main(){
    srand((unsigned)time(NULL));
    for (int i = 0; i < 5; i++) 
       cout << rand()%10+1 << endl; // 5 10 8 8 5
       return 0;
}
        那么如果我们想要产生n个随机数,并且可能需要比较他们的大小呢,这时我们可以再循环中用数组保存随机数的值

#include<iostream>
#include<cstdlib> // it depends your IDE
#include<ctime>
using namespace std;
int main(){
    int random[5]; 
    srand((unsigned)time(NULL));
     for (int i = 0; i < 5; i++) 
    {
        random[i] = rand()%10+1;
        cout<<random[i]<<" ";
    }
       cout<<endl;
       return 0; 
}

        此时有一点需要注意:srand()函数是不能包含在循环体中的,否则想会出现产生多组随机数完全相同的情况。原因也是因为执行循环体时间过短,当seed不变时,rand也不变,而导致了生成的数变成了伪随机数。

        下面附带以一个小小的Demo,关于自动售货机1元抽奖的中奖概率作为练习,没什么技术含量,但求自己娱乐嘛~

#include <iostream>
#include <ctime>
#define TIMES 10000000
using namespace std;

int main(){
	double success =0;
	double rate = 0;
	int random[2];
	int count = 1;
	while(1)
	{
	cout<<"第"<<count++<<"次模拟中......"<<endl;
	srand((unsigned)time(NULL));
	for (int i = 0; i<TIMES;i++) //模拟循环抽奖,求出中奖的概率
	{			
		for (int j = 0; j<2;j++)
		{	
			random[j] = rand()%3+1;
		}
		if (random[0] == random[1])
		{
			success ++;
		}
	}
	rate = success/TIMES*100;
	cout<<"自动售货机中奖的概率为:"<<rate<<"%"<<endl;
	success = 0;
	system("PAUSE");
	}
	return 0;
}
          如有不足之处,欢迎大家指出!

Photoshop图像处理一点通

Photoshop图像处理一点通
  • 2015年08月11日 13:51

自己工作的一点感想

工作经验总结
  • u014102727
  • u014102727
  • 2016-08-27 20:50:22
  • 420

一篇关于学C++的感想(拿来与大家分享)

学计算机的如果你有耐心看下去,我敢保证这绝对是一种收获 期待爱 大师提醒: 计算机专业不是学编程,而是懂得计算机的工作原理,以及和计算机相关的学科技术。一个高手不必懂得编程,coder是最底层的人物...
  • u013255737
  • u013255737
  • 2013-12-28 14:24:02
  • 1792

关于MFC技术的一点感悟

好久没有来CSDN了,好久没有写代码了,本人非计算机专业,偶然的一次机会接触到了编程,便产生了一定的兴趣,之后主要以微软的MFC技术为主要的技术手段陆陆续续的编写了一些自娱自乐的小软件。毕竟MFC是我...
  • sdshensheng
  • sdshensheng
  • 2012-05-24 09:47:59
  • 467

关于敏捷开发的一点总结

再次参与敏捷开发项目2年多了,期间有敏捷教练的指导,也有实践的一点感悟:由于从事的岗位,站的角度偏向于从开发人员的角度、开发负责人角度的一些总结:Part1:遵从的理念:尽快交付有价值的东西。敏捷开发...
  • chunyexiyu
  • chunyexiyu
  • 2017-06-22 00:15:23
  • 198

厘清了xorg里的一些概念

这里有《厘清了xorg里的一些概念》http://www.linuxfans.org/bbs/redirect.php?tid=187579&goto=lastpost厘清了xorg里的一些概念今天看...
  • onfoot
  • onfoot
  • 2009-12-11 08:31:00
  • 1339

C++产生随机数,并用冒泡对其排序求最大值

写这个程序的主要原因是,课程作业需要用LabVIEW写类似的一个功能,我就试着用C++写一下试试,其实原理很简单,就是用rand()函数产生随机数存入到数组当中去,然后对数组中的 数用冒泡算法进行排...
  • cygreat
  • cygreat
  • 2017-12-29 11:30:29
  • 181

关于学习的一点感悟

首先声明一下:这里的学习并不特指软件学习,是我工作学习中得到的一些感悟。 人不可能理解他没接触过的事物      学习的时候,如果只是枯燥的文字,复杂的公式的话,一些很好的书籍或者只是便成为了催眠良...
  • zhenggaoxing
  • zhenggaoxing
  • 2015-01-14 17:05:20
  • 633

对数据库连接的一点感悟

数据库就是部署在一台设备上的服务器软件,通过数据库可以存储各种各样的数据。 要对数据库进行增删改查等操作必须先与数据库建立连接,各种应用程序都可以与数据库建立连接,但在同一时刻与数据库建立的连接数量...
  • funnyrand
  • funnyrand
  • 2011-11-29 22:03:13
  • 200

对单元测试的一点感悟

想当年毕业设计就是测试驱动开发,所以从刚入行开始就对单元测试、测试驱动开发有比较深入的认识,刚开始一直作为敏捷开发的忠实粉丝。但是几年工作下来,我开始对单元测试持矛盾的态度:单元测试当然是一种很好的创...
  • Andeewu
  • Andeewu
  • 2014-04-06 01:10:45
  • 830
收藏助手
不良信息举报
您举报文章:[C++]对随机数的一点感悟
举报原因:
原因补充:

(最多只允许输入30个字)