假設我正在寫一個簡單的運氣遊戲 - 每個玩家按下回車鍵,遊戲給他一個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