假设我正在写一个简单的运气游戏 - 每个玩家按下回车键,游戏给他一个1-6之间的随机数。就像一个立方体。在游戏结束时,具有最高数字的玩家获胜。概率随机数发生器
现在,让我们说我是个骗子。我想写这个游戏,所以玩家#1(这将是我)有90%的概率得到6个,2%得到每个其余的数字(1,2,3,4,5)。
如何生成一个随机数,并设置每个数的概率?
假设我正在写一个简单的运气游戏 - 每个玩家按下回车键,游戏给他一个1-6之间的随机数。就像一个立方体。在游戏结束时,具有最高数字的玩家获胜。概率随机数发生器
现在,让我们说我是个骗子。我想写这个游戏,所以玩家#1(这将是我)有90%的概率得到6个,2%得到每个其余的数字(1,2,3,4,5)。
如何生成一个随机数,并设置每个数的概率?
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 2010-06-10 16:45:37
哦,当然,一种*可定制*的方式来作弊。我会添加一个。 – 2010-06-10 16:52:52
@Andrey:但是,由于它不是伪代码,它不是一个伪回答。 :) – MusiGenesis 2010-06-10 16:53:54
您有几种选择,但一个方法是拉动1和100之间的数字,并用你的权重赋值给一个骰子面号。
所以
1,2 = 1
3,4 = 2
5,6 = 3
7,8 = 4
9,10 = 5
11-100 = 6
这会给你你需要的比例,也将是相当容易调教后。
这是最简单和最常用的方法。它有时被称为*概率分布向量*。实际上,大多数实现使用范围字典,并根据随机生成的值执行查找。 – LBushkin 2010-06-10 16:48:55
可以定义分配的阵列(伪代码):
//公平分配
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;
}
我是骰子号码。
现在,如果你想作弊的变化阵列:
array = {0.1, 0.1, 0.1, 0.1, 0.1, 0.5 };
,你将有50%得到(而不是16%)6
+1“比方说,我是个骗子“。 – 2013-08-08 12:31:56