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

        每次用到随机数的时候都会记不清随机数具体的用法,那么自己今天就来好好的总结一下。

伪随机数

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

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;
}
          如有不足之处,欢迎大家指出!

年度总结,一点感悟

10-30

经过近一年的对程序员前途迷茫的不安,经历了最浮躁、惶恐、颓废和急功近利的rn阶段,现在的我已经渐渐看到了自己努力的方向,变得更成熟稳健,而且增长了社会阅rn历和处世技巧。rn 首先,我已经跳离了程序员的狭隘视野。以前我学C++Builder一年,而后来的近2年rn无非只是在运用原有知识在搭积木和提高点编程技巧而已,虽然有了不少经验,但归根rn到底像李维大师所说的一样是在原地踏步,脚下的石头陷入三分,但别人已经跑你前头。rn所以,必须在精通一、两门语言的基础上,掌握或了解其他各项最近技术,并为以后的rn整合思想的产生打下基础。rn 如果你熟悉了当今几乎所有的最新主流语言的开发、特点、和其他语言的比较利弊,rn网络最新技术,各种协议特点和应用范围,各种主流操作系统架构、开发环境等等,自rn然而然就会产生整合的概念。而因为我现在还没有掌握(或了解)全部最新主流技术,rn所以我还只是在学习的层次阶段,一旦赶上技术前沿,我就可以进入下一个阶段:创新rn阶段。rn 关于学习方法的问题,如原我学OO时,类的构造函数、继承、重载等概念很模糊,怎rn么也不能理会其真谛,但后来在解决实际问题时,发现传统的方法很麻烦且可读性、可rn移植性甚至可维护性都很差,这时我自然而然地想到了类的封装,一个程序下来,基本rn了解了OO的应用场合和开发技巧。而不需要在某点上转太深,这些在实际相关问题来临时rn学习更有效,针对性更强,如现在在CSDN上我只学习通用的或我认为以后会经常用到或rn重要的技巧,毕竟精力和时间是有限的,还有很多更值得去学的东西,说的具体点,就是rn如果你去应聘,在很短的时间里你不可能只讲技术,罗列你所知的深层技巧,而是简单指rn出你知道那些技术及它们的应用场合及技巧等,而学习什么技巧,学到什么程度可以在实rn际工作需要中把握,有需求才去学它,除非你想专攻某项技术。rn 如果你只是想当个程序员,是没有前途的,因为编程技术是可以“学习的”,举个rn比较极端的例子:如果你创建了个数据库连接,自动显示公司信息,很简单,但不懂编程rn的人觉得你很厉害,你就开始沾沾自喜了?只是你“知道”而已,而思想更重要,是靠锤rn炼出来的技能,而思想应该从程序设计进化到对工程的开发理解、把握上,而语言就自然rn成了工具而已,有了选择工具的概念。引用李维的一句话:“眼光和趋势”是骨干。rn rn先写到这,喝口水...

一点感悟,欢迎大家指正

11-04

不谈汇编,不谈到二进制,让我们停留在byte,字节,谈我们现在这些高级编程语言所操纵的东西。rnrn对于网络程序而言,对于存储到数据库的格式而言,对于存储到本地的文件而言,规根到底,都是一些Encoding,再规根到底,只不过都是 字节 byte[] 而已;rnrn做网络程序如果不领会到这一步,而被大堆的表象类迷惑,就会云里雾里,最后一头雾水,可能功能都实现了,就是不知道怎么实现的.rnrn建议做网络程序的程序员们先 把存储在本地的文件 摸透,不管是什么格式的,把它拆成N个部分,然后再组合——这样你会更加清楚怎样操作这些让人头疼的“文件”,不要被各种各样的图标所迷惑了,什么Zip,PSD,exe,都只是一些字节,把他们看作一样的东西;rnrn本地的玩透了,那就玩网络吧,不管是 Udp数据,Icmp数据,Tcp数据等等,传输的,都只是一些字节而已,自己做一个Sniffer,然后来截获这些 字节,然后把里面的数据信息提取出来,这样,你就会进步很快的。了解所有的名词都是对字节的排列规则的描叙,就会跟学化学一样,知道了最基本的元素,万千世界只不过是各种元素的组合而已。rnrn还有数据库的数据存储,图像格式,音频格式,视频格式,呵呵,不要头晕,还是把它元素化,抓住它的识别符号,就明白它只不过还是一堆字节而已,要操纵他们,先要知根知本。rnrn如果有了这些基础,再来看 网络音频传输,视频传输,文件传输等等,多线程下载,断点续传,呵呵,万变不离其踪而已!rnrn

对语言,对软件业的一些感悟

06-06

经常看见很多人吵,什么语言好,什么语言有前途。哎其实我也一直限于这个沉思。rn首先必须提出的是rn1、语言是工具(废话吧,往下看)rn——————————————————————————————rn2、应该基于应用选择语言,对于某一领域选择语言,客观的选择,比如:rn # 嵌入式,单片机这样做底层的语言当然选择C,汇编等低级语言。rn # 互联网服务器端一般也选择C。rn # WEB,信息化,企业级应用选择JAVA,.NET rn 等等等rn关于语言是否有前途问题,一般程序员似乎看中(钱途)。影响语言的前途有一般有几个方面:rn1、该语言应用范围,在该行业是否赚钱。rn(比如同样用C++,在游戏行业工资比一般的通用软件高,因为现在游戏行业暴利)rn2、该语言的上手难易。rn (比如一门语言上手难度比较低,就会出现学其的人特别多,培训机构也比较,同样的在应聘过程中人数也比较,rn 曾经去某大型互联网企业面试,做3D游戏程序的寥寥没几个人,但是.NET的却排成长龙。物以稀为贵吧。)rn3、该语言带来的价值或者不可替代性。rn C#语言开发工具特别快速,而且不用关注底层,所以我们游戏行业一般使用其开发工具,一般程序员都去学。LUA脚本简洁,使用方便,嵌入与C/C++交互良好。所以我们选择其作为我们的AI脚本。游戏是特别依赖于操作系统环境的,特别注重发挥操作系统,DX,OPENGL性能的,还要操作GPU,鉴于这样我们选择C++。大家看看我们的选择都是基于语言的特性,而不是盲目的使用某门语言。rnrn说一下现在一边名企的现状吧,注意以下几个关键字:rn开源,效率,价值。rn在某些不想花大量成本买大量软件的授权,他会选择开源的程序语言。所以大家可以发现他们的WEB大多数是C写的CGI,然后效率也是一个方面。在腾讯里面经常会出现一种状况就是技术转型,比如原来PMO部门原来用.NET的,后来集体转C的。有些转了PYTHONE了。我所在企业原来用JAVA做数据推送的,后来全部PY了。我们先不讨论其原因,可以说在技术考量中,觉得这样更有价值。rnrn所以得出这样结论:应用决定于技术选型,在当前软件产业其实技术之争也就是掌握这几门语言的企业之争。而我们只能根据自己应用状况选择语言。rnrn常常有人说精通一门语言就好了。我承认着根本。rn精通一门语言,等于进入一个使用这门语言进行应用的行业。在这个领域有所作为。能得到良好的发展。rn但是我觉得语言的精通,并不意味你工作于这个行业就成为高人,其仅仅代表书写代码,工程能力。比如3D游戏开发领域吧,rn用的C++语言,其实你更重要要熟悉的3D图形学,图像优化,渲染,服务器集群。其实就是如果使用语言如果解决一定问题。rnrn说了这么多,大家是否有共鸣,努力吧,选择自己喜欢的语言,选择自己喜欢的领域加油吧。rn

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试