今天来更新一下关于随机数生成器的应用。
众所周知,在C里面,最简单的随机数生成器是rand()函数。但由于其是伪随机的,因而我们在使用它的时候一般都会用srand()来控制。进一步详细的说明可以参见百度百科。
那么废话不多说,首先给出最简单的rand()用法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26// 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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49#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-随机数生成器内容请搜索靠谱客的其他文章。
发表评论 取消回复