操作系统
操作系统
c/c++生成随机数
操作系统 2020-01-14 20:11

如题,自己机器为陆10个人操作系统,想用C++自带函数生成一个五人数的伪随机数,但随意怎么折腾,最多到32767,代码如下:

  相信只如果程序猿都会分晓rand(卡塔尔(قطر‎函数是用来取随机数的三个库函数,不过它出的结果真的是意气风发组随机数吗?大家来会见这段代码运营的结果:

rand()

  • #### 生成三个0~RAND_MAX的大肆数

c/c++生成随机数。RAND_MAX的限量起码是在32767时期(int卡塔尔(قطر‎。用unsigned int 双字节是65535,四字节是4294967295的卡尺头范围。0~RAND_MAX种种数字被入选的机率是相仿的。

#include <iostream>
using namespace std;
int main()
{
    cout<<rand()<<endl;
    return 0;
}

运行结果:
16807
[Finished in 0.3s]

该函数原型为 int rand() , 无参数,发生三个范围在0到RAND_MAX之间的数,通过取余能够获取钦赐范围的随机数。
要获取0~1时期的浮点数,能够使用rand(卡塔尔 / double(RAND_MAX)

  • #### 生成四个0~x的恣意数
#include <iostream>
using namespace std;
int random(int x){
    return rand()%x;
}
int main()
{
    for(int i=0;i<10; i++){
        cout<<" "<<random(10);
    }
    cout<<endl;
    return 0;
}

运行结果:
 7 9 3 8 0 2 4 8 3 9
[Finished in 0.3s]
  • #### 生成二个m~n的轻巧数
#include <iostream>
using namespace std;
int random(int m, int n){
    if(m>n){
        return rand()%(m-n+1)+n;
    }
    else if(m==n){
        return m;
    }
    else{
        return rand()%(n-m+1) + m;
    }
}
int main()
{
    for(int i=0;i<10; i++){
        cout<<" "<<random(5,15);
    }
    cout<<endl;
    return 0;
}

运行结果:
 15 6 5 11 13 8 7 5 14 9
[Finished in 0.3s]

以上的代码生成的随机数范围是[m, n],通过不相同的设定,随机数能够是[m, n)或是(m, n],或是(m, n)。

(a,b) (rand()%(b-a+1))+a-1
[a,b) (rand()%(b-a))+a
(a,b] (rand()%(b-a))+a+1
[a,b] (rand()%(b-a+1))+a

澳门正规赌博官方网址,留意,以上多个程序每一次履行发生的结果是平等的,正是个伪随机数。rand(State of Qatar发生随机数与实际的种子有关,当不用srand(卡塔尔获取种牛时,种子的暗中同意值为1,因而必要用srand(卡塔尔(قطر‎函数发生分裂的种子,种子的值能够人为设定。要是为了发生区别的种子值,平常用时间作为参数值。

stringresultfile="..\output\result_pseudoRandomNum.txt";ofstreamfout(resultfile);srand((longlong)time(0));for(inti=0;i100000;i++){fout(rand()%100000)endl;}
 1 #include<stdio.h> 2 #include<stdlib.h> 3 int main(void) 4 { 5     int j; 6     for(j=0;j<5;j++) 7     { 8         printf("rand():%dn",rand; 9     }    10 }

srand()

srand(卡塔尔函数原型:void srand(unsigned seed)

#include <iostream>
using namespace std;
int main()
{
    cout<<rand()<<endl;//default = 1, which is the same with below
    srand(1);
    cout<<rand()<<endl;
    srand(23);
    cout<<rand()<<endl;
    srand((int)time(NULL));
    cout<<rand()<<endl;
    cout<<rand()/double(RAND_MAX)<<endl;
    return 0;
}

运行结果:
16807
16807
386561
679799174
0.359358
[Finished in 0.3s]

看那个函数的牵线,日常都以说与数据类型相关。rand(卡塔尔国重临生龙活虎随机数值的限量在0至RAND_MAX间。RAND_MAX的界定最少是在32767里面(intState of Qatar。用unsignedint双字节是65535,四字节是4294967295的整数范围。0~RAND_MAX每一种数字被入选的机率是平等的。但自己那边后生可畏度在种子里将数据类型设置为Longlong了,怎么照旧拾贰分呢?请各位高手帮助解答一下,感激。

linux下gcc每回运转结果如下:

澳门正规赌博官方网址 1

windows vc6.0每便运营结果如下:(本人windows系统为64个人机)

澳门正规赌博官方网址 2

(由于编写翻译器的例外,或然来得的结果也不及呢!)

rand(卡塔尔国函数不是不管三七七十意气风发的啊?怎么每便运转的结果都是生龙活虎律的?其实Computer也不像大家想象的那么智能,它也是依照大家的沉思来随意出数的。本身在linux下查找头文件并未有找到rand(卡塔尔国函数的定义,上网查了生机勃勃晃也没找到,说是被打包到库中了。假设有大拿们看来那篇随笔,请帮帮大哥解除心中的疑问呢!

那么怎么样用rand(卡塔尔函数获取你想要的取值范围吗?其实rand(卡塔尔函数的取值范围在0~RAND_MAX之间;

那么如何是RAND_MAX呢?

linux下的RAND_MAX值为2147483647

windows下的RAND_MAX值为32767

综上所述RAND_MAX是基于编写翻译器对int型分配的空中而定的;这种说法应该也是错的,因为自己在windows下的vc中打印sizeof的值之后依旧显示4,也便是说int在vc中的存款和储蓄空间应该是33个人,所以小编觉着是vc编写翻译器对rand(卡塔尔(قطر‎函数的定义做了校勘,使RAND_MAX的值更加小,方便了开辟者的取值;(上边会介绍为啥编写翻译器那样做)