- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在模拟 St Petersburg Paradox当我意识到我的抛硬币代码从未记录过任何连续出现超过 15 次正面朝上的条纹时。我运行了 100,000,000 次模拟,结果应该是平均 1526 次 头朝上的条纹 16 长。
(0.5^16) x 100,000,000 = 1526
显然,有些地方出了问题。
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main(int argc, char const *argv[])
{
srand(time(0));
int i, lim = 100000000, streak = 0, maxstreak = 0;
for (i = 0; i < lim; ++i)
{
if (rand()%2) {
streak++;
if (streak > maxstreak) maxstreak = streak;
}
else streak = 0;
}
printf("Ran %d times, longest streak of %d\n", lim, maxstreak);
return 0;
}
每次返回以下内容:
Ran 100000000 times, longest streak of 15
感谢您的帮助!
编辑:在 Windows 7 x64 上运行 GCC 4.6.2 版。一般编程有点新。
编辑2:感谢大家的帮助!任何留下来的人,我想知道当前的实现会限制 15 个头像吗? rand()
函数是如何被如此有趣地破坏以产生这个问题的?
最佳答案
尝试为您的随机数生成器选择不同的种子值。虽然 rand() 是一个非常好的随机数生成器,但它实际上是一个伪随机数生成器。您可能想阅读 rand (man -s3 rand) 的手册页,其中明确指出您应该(对于某些实现)使用高阶位而不是低阶位...
NOTES
The versions of rand() and srand() in the Linux C Library use the same
random number generator as random(3) and srandom(3), so the lower-order
bits should be as random as the higher-order bits. However, on older
rand() implementations, and on current implementations on different
systems, the lower-order bits are much less random than the higher-
order bits. Do not use this function in applications intended to be
portable when good randomness is needed. (Use random(3) instead.)
在不了解您运行程序的系统的更多信息的情况下,我们无法知道这是否是您的问题。但是请尝试更改您的代码以使用不同于 2^0 位的位。
运行你的版本对我有用,
/coinflipsim
Ran 100000000 times
head 50006650, streak 27
tail 49993350, streak 25
这是适合我的代码,使用与位 0 不同的位,
int main(int argc, char const *argv[])
{
srand(time(0));
int i, lim = 100000000;
int head=0, tail=0;
int hstreak=0, tstreak=0;
int hstreakmax=0, tstreakmax=0;
for (i = 0; i < lim; ++i)
{
//if (rand()%2)
if( rand() & (1<<13) ) //pick a bit, try different bits
{
head++;
if( ++hstreak>hstreakmax) hstreakmax=hstreak;
tstreak=0;
}
else {
tail++;
if( ++tstreak>tstreakmax) tstreakmax=tstreak;
hstreak=0;
}
}
printf("Ran %d times\n",lim);
printf("head %d, streak %d\n",head,hstreakmax);
printf("tail %d, streak %d\n",tail,tstreakmax);
return 0;
}
将 rand()%2 行更改为此并重新运行,
if( rand() & (1<<13) ) //pick a bit, try different bits
不同的结果,
./coinflipsim
Ran 100000000 times
head 50001852, streak 25
tail 49998148, streak 28
关于投币模拟从未超过 15 次正面朝上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19804460/
我想知道我的前台表单上是否存在用户或电话, 我不等待答案,而是等待告诉我去做的事情。 我使用 Yup + Formik 来满足我的所有需求。 在我的 Sequelize 后端,我设法显示用户名或电话是
肯定按钮、否定按钮和中性按钮之间是否存在功能差异,尤其是在 AlertDialogs 的上下文中? 最佳答案 只是他们在对话框中的位置...... 在 Honeycomb 之前的设备上,按钮顺序(从左
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
我的客户买了一个 PositiveSSL 证书,他给了我 2 个文件,crt 和 ca-bundle。 如何将这些文件安装到 ubuntu 服务器并使 https 协议(protocol)工作? 仅供
我正在使用 NLTK 在 Python 中设计一个文本分类器。每个句子中考虑的特征之一是它的情绪。我想比那些没有任何情绪的句子(中性句子)更加权具有积极或消极情绪的句子。使用电影评论语料库和朴素贝叶斯
使用 Plotly,我可以轻松绘制单条线并填充该线和 y == 0 之间的区域: import plotly.graph_objects as go fig = go.Figure() fig.add
(注意:有一些类似的问题,但我找不到完全重复的问题) 问题 考虑抛硬币任意次数。在得到 3 个反面之前得到 2 个正面的概率是多少? 代码 为了模拟这一点,我设置了 10000000 次试验,其中 0
我有一个关于三个 JS 的问题。 fiddle https://jsfiddle.net/syildiz/fk8thLsq/17/ 我想创建一个跟随鼠标移动的眼睛。我上传的图片同时在背景中可见,并且在
我想将 countup.js 与自动 css 格式(颜色)相结合。我有以下三个条件的地方: 如果小于 0 则为红色 如果等于 0 则为黑色 如果大于 0 则为绿色 sample file包含三个数字(
s = "some {text|in|braces} found" 获取大括号之间的内容 s.scan(/(? ["text|in|braces"] 现在要获取不在大括号中的内容,我试过了 s.sca
我正在尝试使用 Stanford Core NLP 检查一个陈述是肯定的还是否定的。 我在网上找到了一些 Java 引用资料,并且能够将缺失的部分转换/编码为 C#。 在尝试获取情绪分数时 - 我总是
我是一名优秀的程序员,十分优秀!