【问题标题】:Probability Random Number Generator概率随机数发生器
【发布时间】:2011-03-02 06:44:07
【问题描述】:

假设我正在编写一个简单的运气游戏 - 每个玩家按 Enter 键,游戏会为他分配一个 1-6 之间的随机数。就像一个立方体。游戏结束时,数字最高的玩家获胜。

现在,假设我是个骗子。我想编写游戏,所以玩家 #1(将是我)有 90% 的概率获得 6,并且有 2% 的概率获得其余数字(1、2、3、4、5)。

如何随机生成一个数字,并为每个数字设置概率?

【问题讨论】:

  • +1 表示“假设我是个骗子。”

标签: c# random probability


【解决方案1】:
static Random random = new Random();

static int CheatToWin()
{
    if (random.NextDouble() < 0.9)
        return 6;

    return random.Next(1, 6);
}

另一种可定制的作弊方式:

static int IfYouAintCheatinYouAintTryin()
{
    List<Tuple<double, int>> iAlwaysWin = new List<Tuple<double, int>>();
    iAlwaysWin.Add(new Tuple<double, int>(0.02, 1));
    iAlwaysWin.Add(new Tuple<double, int>(0.04, 2));
    iAlwaysWin.Add(new Tuple<double, int>(0.06, 3));
    iAlwaysWin.Add(new Tuple<double, int>(0.08, 4));
    iAlwaysWin.Add(new Tuple<double, int>(0.10, 5));
    iAlwaysWin.Add(new Tuple<double, int>(1.00, 6));

    double realRoll = random.NextDouble(); // same random object as before
    foreach (var cheater in iAlwaysWin)
    {
        if (cheater.Item1 > realRoll)
            return cheater.Item2;
    }

    return 6;
}

【讨论】:

  • 哦,当然,一种可定制的作弊方式。我加一个。
  • @Andrey:然而,因为它不是伪代码,所以也不是伪答案。 :)
  • @Anthony:确保您自定义您的方法以适应任何可能的机会游戏。等一下,我帮你查一下百家乐的规则。
  • @MusiGenesis,作弊必须是可扩展的。
  • 如果概率为0,则返回6。
【解决方案2】:

您有几个选择,但一种方法是提取 1 到 100 之间的数字,然后使用您的权重将其分配给骰子面数。

所以

1,2 = 1
3,4 = 2
5,6 = 3
7,8 = 4
9,10 = 5
11-100 = 6

这将为您提供所需的比率,并且以后也很容易调整。

【讨论】:

  • 这是最简单最常用的方法。它有时被称为概率分布向量。在实践中,大多数实现都使用范围字典,并根据随机生成的值在其中执行查找。
【解决方案3】:

您可以定义分布数组(伪代码):

//公平分配

array = {0.1666, 0.1666, 0.1666, 0.1666, 0.1666, 0.1666 };

然后从0到1掷骰子,保存到x然后做

float sum = 0;
for (int i = 0; i < 6;i++)
{
   sum += array[i];
   if (sum > x) break;
}

i 是骰子数。

现在如果你想作弊改变数组为:

array = {0.1, 0.1, 0.1, 0.1, 0.1, 0.5 };

你将有 50% 获得 6 个(而不是 16%)

【讨论】:

    猜你喜欢
    • 2012-04-14
    • 2019-08-11
    • 1970-01-01
    • 2011-04-10
    • 2017-10-01
    • 2016-01-26
    • 2014-10-06
    • 2017-11-26
    • 2012-02-11
    相关资源
    最近更新 更多