我是靠谱客的博主 强健铃铛,这篇文章主要介绍5634-2-随机数生成器的应用1-二项分布,现在分享给大家,希望可以做个参考。

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

众所周知,在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-随机数生成器内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(117)

评论列表共有 0 条评论

立即
投稿
返回
顶部