04 | 随机函数:随机实验真的可以算 π 值嘛?
今日任务
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了使用随机函数计算圆周率 π 的方法。首先介绍了 π 的定义和古代数学家们为了计算 π 的精确值所做的努力。随后引入了蒙特卡罗法,通过大量的随机实验来计算 π 的值。文章还介绍了真随机和伪随机的概念,以及在 C 语言中使用随机函数的方法。最后,提出了一个思考题,要求设计一个迷你随机函数,循环输出 1~100 中的每个数字,但要求输出的规律不太明显。通过本文的介绍,读者可以了解到随机函数的概念和在计算 π 值中的应用,以及如何在程序中使用随机函数进行随机数生成。文章内容生动有趣,通过实例代码展示了随机函数的应用,对读者进行了技术知识的传授和思维能力的锻炼。
《人人都能学会的编程入门课》,新⼈⾸单¥59
全部留言(43)
- 最新
- 精选
- 栾~龟虽寿!老师很厉害,才4节课你就会看到,老师想说,学编程,为做事高效,为生活添彩,如果你不断重复,成功概率会变化。
作者回复: d(^_^o) 你这总结的太棒了,我得记下来!
2020-01-128 - rocedurand实现用的公式给一下,更能说明伪随机性。
作者回复: int __cdecl rand ( void ) { _ptiddata ptd = _getptd(); return( ((ptd->_holdrand = ptd->_holdrand * 214013L + 2531011L) >> 16) & 0x7fff ); }
2020-02-027 - Noya老师, 计算机中的随机其实就是一个循环的序列对吗, 然后每次过去一个, 就"随机"了
作者回复: 对的。这个序列很大,我们不可知,所以对于我们来说,跟随机没啥区别。
2020-04-284 - 点金思考题: #include <stdio.h> int main(){ int n=5; for (int i=1;i<=100;++i){ printf("%3d",n); if (i%10==0) printf("\n"); n*=3; while (n>100) n-=102; } return 0; } 按老师的提示程序是写出来了,不过还是有几个疑问: 1、这个规律的正确性如何证明,即这个函数如何做到遍历100个数不遗漏且不重复; 2,可否把每次扩大的倍数由3改成其它值,如果可以的话,超出100后,每次又要减去什么数了呢? 3、扩大的倍数可以是哪些值,我目前能想到的是肯定不能是100的因数
作者回复: 可以的。正确性证明的话,需要有一些数论基础知识作支撑,例如:欧拉函数,费马小定理及欧拉定理。
2020-04-0422 - Jinlee老师您好,为啥我的结果里面有重复的数字呢 #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int i, j; srand(time(0)); //初始化随机数种子 for (i = 1, j = 1; i <= 100; i++, j++) { printf("%d\t", 1+rand() % 100); if (j % 10 == 0) printf("\n"); } system("pause"); return 0; }
作者回复: 当然会有重复数字了,因为你对rand的结果取余了。rand的循环长度可能很大,可取余100以后,就很容易出现重复啊。就比如101和100001取余100,不都是1么。
2020-01-1422 - 小风老师这个随机函数那个RAND_MAX是什么概念,怎么用的呢
作者回复: 这个 RAND_MAX 你可以认为是一个和编译环境相关的数字,后面讲完宏以后,你就可以理解了,其实这就是一个宏。平时基本不用这个东西,对这个东西有个基本的概念即可。
2020-05-011 - 罗耀龙@坐忘茶艺师学编程 思考题:设计一个循环过程,循环 100 次,以不太明显的规律输出 1~100 中的每个数字。 在这里,我遇到的坑: 1、随机生成了一个数,重复了100次; 2、能随机生成了不一样的数字,但数字数量是101个; 最后我能实现的,是按要求生成了100个范围在(1,100)的随机数,且做到每次运行都不一样。 这是代码: #include <stdio.h> #include <stdlib.h> //srand(),rand()需要的说明 ,好像time也要这个 #include <time.h> //time()必要的说明 int main(){ srand(time(0)); //这里保证我每次运行程序得出的随机数都不一样 ,用时间函数作为随机种子 for (int i = 0;i<100;i++){ int X = 99 * rand()/RAND_MAX + 1; //目标是1-100之间的整数,而RAND_MAX取值范围是0到最大值,0-99正好就是100个数字 printf("%d\t",X); } return 0 ; }
作者回复: 可以参考我后面文章中的答案。
2020-04-241 - 落曦作业 #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int i; for(i=0;i<100;i++) printf("%d\t", rand() % 100); // 永远输出固定值 return 0; }
作者回复: 仔细看作业要求,要求是输出100次,不重不漏的输出1--100中的数字。
2020-03-2721 - Geek_29429b请教老一个问题,这是我照书上写的一个程序,但我不知道怎么测试这个程序是否正确,因为当我执行这个程序后,在控制台无论输入什么,都不会执行printf()方法: #include <stdio.h> /* 统计各个数字、空白符及其他字符出现的次数 */ int main() { int c, i, nwhite, nother; int ndigit[10]; nwhite = nother = 0; for (i = 0; i < 10; ++i) ndigit[i] = 0; while ((c = getchar()) != EOF) if (c >= '0' && c <= '9') ++ndigit[c - '0']; else if (c == ' ' || c == '\n' || c == '\t') ++nwhite; else ++nother; printf("digits ="); for (i = 0; i < 10; ++i) printf(" %d", ndigit[i]); printf(", white space = %d, other = %d\n", nwhite, nother); return 0; }
作者回复: 结束条件是读入到文件末尾结束,也就是那个不等于EOF的判断。所以无论你输入什么内容,都是正常的内容,都不是EOF,程序也就都不会结束。你需要搜索在你的环境中如何输入EOF,一般是ctrl+z
2020-02-141 - rocedu"记住,计算机就是你的小帮手了,以后的日子里,请动用你的智力,使用它的体力!"这真说出了为何人人都需会点编程。
作者回复: d(^_^o)
2020-02-031