Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 最好是平局掷硬币?_C#_Math_Probability - Fatal编程技术网

C# 最好是平局掷硬币?

C# 最好是平局掷硬币?,c#,math,probability,C#,Math,Probability,我正在为我的聊天机器人构建一个掷硬币游戏,我想在它的一侧加入一个非常罕见的硬币落地事件会很有趣。根据这篇文章,美国镍币的赔率大约为6000分之一: 基于该模型的外推表明,美国镍在边缘着陆的概率约为6000次投掷中的1次 我已经创建了一个解决方案,它可以工作,但在我的上一次运行中,它对正面结果影响很大(从零到绘制的3次迭代中的前10个结果:11个尾部,19个头部): 这方面的代码非常简单,但由于在5800和6200之间的随机数上使用模,使得绘图的频率似乎低于6000次迭代中的大约1次: int r

我正在为我的聊天机器人构建一个掷硬币游戏,我想在它的一侧加入一个非常罕见的硬币落地事件会很有趣。根据这篇文章,美国镍币的赔率大约为6000分之一:

基于该模型的外推表明,美国镍在边缘着陆的概率约为6000次投掷中的1次

我已经创建了一个解决方案,它可以工作,但在我的上一次运行中,它对正面结果影响很大(从零到绘制的3次迭代中的前10个结果:11个尾部,19个头部):

这方面的代码非常简单,但由于在
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编写的,但其他读者可能不会,并因此而导致编译器错误。:)@墨西哥玉米薄饼卷タコス 好的,我已经补充了。