C# 最好是平局掷硬币?
我正在为我的聊天机器人构建一个掷硬币游戏,我想在它的一侧加入一个非常罕见的硬币落地事件会很有趣。根据这篇文章,美国镍币的赔率大约为6000分之一: 基于该模型的外推表明,美国镍在边缘着陆的概率约为6000次投掷中的1次 我已经创建了一个解决方案,它可以工作,但在我的上一次运行中,它对正面结果影响很大(从零到绘制的3次迭代中的前10个结果:11个尾部,19个头部): 这方面的代码非常简单,但由于在C# 最好是平局掷硬币?,c#,math,probability,C#,Math,Probability,我正在为我的聊天机器人构建一个掷硬币游戏,我想在它的一侧加入一个非常罕见的硬币落地事件会很有趣。根据这篇文章,美国镍币的赔率大约为6000分之一: 基于该模型的外推表明,美国镍在边缘着陆的概率约为6000次投掷中的1次 我已经创建了一个解决方案,它可以工作,但在我的上一次运行中,它对正面结果影响很大(从零到绘制的3次迭代中的前10个结果:11个尾部,19个头部): 这方面的代码非常简单,但由于在5800和6200之间的随机数上使用模,使得绘图的频率似乎低于6000次迭代中的大约1次: int r
5800
和6200
之间的随机数上使用模,使得绘图的频率似乎低于6000次迭代中的大约1次:
int result = _random.Next(2);
if (++_tossCount % _random.Next(5800, 6200) == 0) {
result = 2;
_tossCount = 0;
}
switch (result) {
case 0: return "Heads.";
case 1: return "Tails.";
default: return "It was a draw!";
}
\u random
和\u tossCount
是类中的字段,分别在构造函数中初始化为new random()
和0
(它们可以在main的开头初始化,但是在迭代器之外,以便在控制台应用程序中进行复制)。上面的代码是一个返回字符串的方法,可以在您选择的迭代器中调用该字符串来复制流程。我使用了do while
进行测试,但for
的也同样有效
如何提高平均分配正面和反面结果的概率,以及大约每6000次呼叫就获得一次平局?要获得正确的赔率,您可以创建一个介于1和12000之间的随机数,其中各种结果由范围表示:
enum CoinTossResult { Heads, Tails, Draw };
CoinTossResult TossCoin()
{
return _random.Next(1, 12000) switch
{
<= 5999 => CoinToss.Heads,
<= 11998 => CoinToss.Tails,
_ => CoinToss.Draw
};
}
enum cointosresult{Heads,Tails,Draw};
CointosResult TossCoin()
{
返回随机。下一个(11200)开关
{
投币,人头,
投币,投币尾,
_=>掷硬币。抽签
};
}
现在平局的概率是6000分之一。正面和反面平分6000人中剩余的5999人
注意:使用的语法仅在中可用。要获得正确的赔率,您可以创建一个介于1和12000之间的随机数,其中各种结果由范围表示:
enum CoinTossResult { Heads, Tails, Draw };
CoinTossResult TossCoin()
{
return _random.Next(1, 12000) switch
{
<= 5999 => CoinToss.Heads,
<= 11998 => CoinToss.Tails,
_ => CoinToss.Draw
};
}
enum cointosresult{Heads,Tails,Draw};
CointosResult TossCoin()
{
返回随机。下一个(11200)开关
{
投币,人头,
投币,投币尾,
_=>掷硬币。抽签
};
}
现在平局的概率是6000分之一。正面和反面平分6000人中剩余的5999人
注意:使用的语法仅在中可用。我不明白数字5800和6200从何而来。@RobertHarvey它们是我选择的随机数,以增加平局几率的随机性。基本上是为了防止每6000次迭代发生一次抽签。你不能选择一个介于0和6000之间的随机数吗。数字0-2999为正面,3000-5999为反面,6000为边缘(包括所有)。或者从1到6000之间选择一个数字开始:如果是6000,那么你就有优势。否则,选择一个介于0和1之间的数字作为正面和反面的对比。(如果我不参加会议,我会这样做)为了获得准确的几率,它需要1-5999个正面,6000-11998尾和11999-12000抽签。我不明白5800和6200这两个数字是从哪里来的。@RobertHarvey他们是我随机选择的数字,以增加抽签几率的随机性。基本上是为了防止每6000次迭代发生一次抽签。你不能选择一个介于0和6000之间的随机数吗。数字0-2999为正面,3000-5999为反面,6000为边缘(包括所有)。或者从1到6000之间选择一个数字开始:如果是6000,那么你就有优势。否则,选择一个介于0和1之间的数字作为正面与反面的对比。(如果我不参加会议,我会这样做)为了获得准确的概率,它需要是1-5999正面、6000-11998反面和11999-12000平局。为了将来的读者,您介意包括使用开关表达式语法所需的.NET版本吗?我知道它是用C#8编写的,但其他读者可能不会,并因此而导致编译器错误。:)@墨西哥玉米薄饼卷タコス 好的,我已经添加了。为了将来的读者,您是否介意包含使用开关表达式语法所需的.NET版本?我知道它是用C#8编写的,但其他读者可能不会,并因此而导致编译器错误。:)@墨西哥玉米薄饼卷タコス 好的,我已经补充了。