C_C++随机数据生成(is how to use but not how it work)

来源:互联网 发布:网络男歌手的伤感歌曲 编辑:程序博客网 时间:2024/06/06 01:14

1.int rand(void)
库:stdlib.h
功能:随机数发生器,值在0至RAND_MAX之间,RAND_MAX定义在stdlib.h, 其值为2147483647
解释:首先不是真的随机数,只是周期比较长。然后如果不设置随机数种子默认是1.

2.void srand(unsigned int seed)
库:stdlib.h
功能:初始化随机数种子
解释:初始化种子,要不每次重新运行程序随机数是一样的。但是重新开始的时候种子仍然是原先设定,所以一般会和time()一起使用。

3.time_t time(time_t* t);
库:time.h
功能:取得从1970年1月1日至 t 的秒数
解释:time_t是long数据类型,前面用typedef重命名的。如果参数是空,默认是当前时间。


下面看具体使用:
1.最简单的生成随机数

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <time.h>using namespace std;int main(){    for(int i=0;i <10;++ i)        printf("%d ",rand());    return 0;}

简单随机数生成

2.结合time设置随机数种子

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <time.h>using namespace std;int main(){    srand((unsigned int)time(NULL));    for(int i=0;i <10;++ i)        printf("%d ",rand());    return 0;}

每次不同的随机数
3.设定指定区域的随机数
思路:如果想得到[a,b]的随机数,等价于获得一个随机数n,将这个随机数和a相加,可以保证a(rand的返回值[0,RAND_MAX]),接下来保证a+n bnba,rand()%(b-a)一定是一个[a,b)的整数(这里取不到b的原因是n的时候余0,所以n取不到)。
a+rand()%nx[a,a+n)
推广一下:
[a,b] a+rand()%(b-a+1)
(a,b] a+1+rand()%(b-a+1)
[a,b) a+rand()%(b-a)
(a,b) a+1+rand(b-a)

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <time.h>using namespace std;int main(){    srand((unsigned int)time(NULL));    int a = 0,b = 0;    printf("input a ans b:\n");    scanf("%d%d",&a,&b);    printf("get random number which range is [%d,%d]:",a,b);    for(int i=0; i <10; ++ i)        printf("%d ",a+rand()%(b-a+1));    return 0;}

指定范围

4.推广一下负数
首先设想一下负数,自然想到上述范围公式,如果将负数代入会怎样?例如我们想要得到[-7,5]之间的随机数,结果如图:
负数
其实上面我们已经证明了范围取值的正确性,负数显然是整数也是符合上述的规则的。
很容易想到[,+],或者包含的情况。这里我只讨论第一种情况,后面的以后又想瞎搞的时候在搞吧。
对于上面的范围,直接想到RAND_MAX/2减去产生的随机数。但是现实很残酷,竟然没有超过一半的!!!不知道原因,这里主要是为了利用上述的思想,我还是想到了一个办法,用一个随机数-随机数。(或者利用计算机存储数值的特点进行二进制左移操作也能得到负数,但是这是简单问题复杂化了)

5.推广一下小数
很容易用分治的思想将产生一个小数分解成产生一个随机整数和[0,1)的小数问题。产生指定整数上面讨论过了,只要知道了[0,1)的随机小数怎么产生就行了。
我们知道rand()产生的是[0,RAND_MAX]的整数,那么我们直接将这个数除以RAND_MAX不就得到了所需的随机小数!
分治完成,归并就可以推广到指定小数了。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 入职体检肝功能异常怎么办 有乙肝怀孕建卡怎么办 重修的课有冲突怎么办 苹果7硬件坏了怎么办 发票记账联丢了怎么办 作废的发票没了怎么办 键盘esc键坏了怎么办 cad中esc键失灵怎么办 出家人老了病了怎么办 宜家吸盘吸不住怎么办 车内吸盘吸不住怎么办 水里吸盘吸不住怎么办 摩托车脱审4年怎么办 摩托车8年没年检怎么办 摩托车4年没年检怎么办 38度5算高烧吗怎么办 刚发现怀孕不想要怎么办 被蜥蜴咬出血了怎么办 去韩国打工签证怎么办多么钱 厕所堵了怎么办有妙招 蹲式厕所老是堵怎么办 下蹲式厕所堵了怎么办 蹲的厕所堵住了怎么办 厕所通了又堵怎么办 蹲式厕所经常堵怎么办 厕所下水管堵了怎么办 厕所堵了水满了怎么办 拉屎把厕所堵了怎么办 厕所堵了不下水怎么办 坐厕所堵了怎么办妙招 火车上丢了东西怎么办 网购的东西丢了怎么办 在酒店丢了东西怎么办 我好懒不想工作怎么办 被宠物刺猬咬了怎么办 被老鼠咬了怎么办打针 手指被老鼠咬了怎么办 孕妇被老鼠咬了怎么办 耳朵里面一直嗡嗡响怎么办 把语言栏删了怎么办 乐视会员到期了怎么办