今天来更新一下关于随机数生成器的应用。

众所周知,在C里面,最简单的随机数生成器是rand()函数。但由于其是伪随机的,因而我们在使用它的时候一般都会用srand()来控制。进一步详细的说明可以参见百度百科。

那么废话不多说,首先给出最简单的rand()用法:

// srand所在的头文件
#include<stdlib.h>
// time参数所在头文件 
#include <time.h>
...

// 生成 [0,1) 的随机数(double)
double rng()
{
    double f;
    f = 1.0 * rand() / RAND_MAX;
    return f;
}


int main(void)
{

...

    srand(time(0)) //设置rand()产生随机数时的随机数种子
    // 参数(0)必须是个整数,如果每次都设相同值,那么rand()所产生的随机数值每次就会一样。

...

}

有意思的是,time(1)与time(0)似乎并没有什么区别,关于这两个的讨论可以参见:

https://stackoverflow/questions/8049556/what-s-the-difference-between-srand1-and-srand0

另外,在网上可以随随便便搜索到很多关于rand()表达式的用法举例,在此随意贴出一二:

要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 
要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 
要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 
通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 
要取得a到b之间的随机整数,另一种表示:a + (int)b * rand() / (RAND_MAX + 1)。 
要取得0~1之间的浮点数,可以使用rand() / double(RAND_MAX)。

来源:https://wwwblogs/afarmer/archive/2011/05/01/2033715.html

好,那么现在问题来了:这东西能用来干嘛呢?

um...我不知道各位读者能用来干嘛,反正我们的作业要用来生成二项分布...

考虑一个简单的二项分布:发生事件的概率p为0.2,重复5次试验,且用上述提到的rand()函数来生成。

二项分布嘛,结果不是TRUE就是FALSE,非1即0嘛。所以,可以考虑生成[0,1)区间内的随机数,然后令随机数小于等于0.2的输出值为1,否则输出0.

那么这样一来就很简单了。在此基础上,如果要进行N组这样的实验(每组实验重复5次,每次实验为1的概率为0.2),然后将结果与实际的二项分布结果对比,以此衡量我们用随机数生成器所构造的二项分布是否确实“有效地”模拟了二项分布。

那么废话不多说,show you my code:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

// 随机数生成器
double rng()
{
    double f;
    f = 1.0 * rand() / RAND_MAX;
    return f;
}

int main(void) 
{
    srand(time(0));
    
    int i, n, output;
    double f, p;
    int N;
	
    // 将结果写入txt文件
    /*    
    FILE *fpWrite = fopen("data.txt","w");
    if(fpWrite == NULL)
    {
        return 0;
    }
    */

    // n = 5, p = 0.2    
    n = 5;
    p = 0.2;
    
    // N=10,100,1000
    for(N = 1; N <= 2; N++)
    {
        for(i = 1; i <= n; i++)
        {
            f = rng();
            printf("N=%d: The #%d f is %lf\n",N,i,f);
            if (f <= p)
                output = 1;
            else output = 0;
            //fprintf(fpWrite,"%d,",output);
            printf("N=%d: The #%d binomial RV output is %d\n\n",N,i,output);
        }       
    }
    //fclose(fpWrite);
}

从结果上来看,当N越大,则随机数生成器模拟的二项分布将会无限接近实际的二项分布。

当然,随机数生成器还有其他很多。各位读者有兴趣可以自行百度。

更多推荐

5634-2-随机数生成器的应用1-二项分布