2010-06-10 36 views
16

Giả sử tôi viết một trò chơi may mắn đơn giản - mỗi người chơi nhấn Enter và trò chơi chỉ định cho anh ấy một số ngẫu nhiên từ 1-6. Cũng giống như một khối lập phương. Vào cuối trò chơi, người chơi có số lượng cao nhất sẽ thắng.Máy phát điện số ngẫu nhiên

Bây giờ, giả sử tôi là kẻ lừa đảo. Tôi muốn viết trò chơi để người chơi # 1 (sẽ là tôi) có xác suất 90% để có được sáu và 2% để nhận được mỗi số còn lại (1, 2, 3, 4, 5).

Làm cách nào để tạo số ngẫu nhiên và đặt xác suất cho mỗi số?

+3

1 cho "chúng ta hãy nói rằng tôi là một đồ lừa đảo . " –

Trả lời

18
static Random random = new Random(); 

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

    return random.Next(1, 6); 
} 

Một cách tùy biến để lừa:

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; 
} 
+1

nó là tùy biến kém – Andrey

+2

Ồ, chắc chắn, một * tùy chỉnh * cách để ăn gian. Tôi sẽ thêm một cái. –

+1

@Andrey: Tuy nhiên, vì nó không phải là mã giả, nó không phải là một câu trả lời giả. :) – MusiGenesis

3

Bạn có một vài lựa chọn, nhưng một trong những cách sẽ để kéo một số từ 1 đến 100, và sử dụng trọng lượng của bạn để gán cho một con xúc xắc số hiệu mặt.

Vì vậy

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

này sẽ cung cấp cho bạn những tỷ lệ mà bạn cần, và cũng sẽ là khá dễ dàng để điều chỉnh sau.

+1

Đây là cách tiếp cận đơn giản và phổ biến nhất. Đôi khi nó được gọi là * vector phân phối xác suất *. Trong thực tế, hầu hết các triển khai sử dụng từ điển phạm vi và thực hiện tra cứu trong đó dựa trên giá trị được tạo ngẫu nhiên. – LBushkin

2

bạn có thể xác định mảng phân phối (giả):

// phân phối công bằng

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

sau đó cuộn dice 0-1, lưu vào x sau đó làm

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

tôi là con xúc xắc.

bây giờ nếu bạn muốn gian lận thay đổi mảng:

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

và bạn sẽ có 50% để có được 6 (thay vì 16%)

Các vấn đề liên quan