概述
今天来更新一下关于随机数生成器的应用。
众所周知,在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.com/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://www.cnblogs.com/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 %lfn",N,i,f);
if (f <= p)
output = 1;
else output = 0;
//fprintf(fpWrite,"%d,",output);
printf("N=%d: The #%d binomial RV output is %dnn",N,i,output);
}
}
//fclose(fpWrite);
}
从结果上来看,当N越大,则随机数生成器模拟的二项分布将会无限接近实际的二项分布。
当然,随机数生成器还有其他很多。各位读者有兴趣可以自行百度。
最后
以上就是强健铃铛为你收集整理的5634-2-随机数生成器的应用1-二项分布的全部内容,希望文章能够帮你解决5634-2-随机数生成器的应用1-二项分布所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复