2012-04-09 51 views
7

Tôi đã nhìn thấy câu hỏi này được hỏi theo nhiều cách, nhưng tôi chỉ cần kiểm tra tính chính xác về những gì tôi đang làm ở đây.Xác suất và số ngẫu nhiên C#

Về cơ bản tôi muốn kích hoạt một sự kiện với một xác suất là 25% dựa trên một số ngẫu nhiên được tạo ra từ 1 đến 100 sử dụng:

int rand = random.Next(1,100); 

sẽ như sau đạt được điều này?

if (rand<=25) 
{ 
    // Some event... 
} 

Tôi nghĩ tôi sẽ sử dụng số từ 1 đến 100 để tôi có thể tinh chỉnh xác suất sau này - ví dụ: điều chỉnh đến 23% bằng cách sử dụng

if (rand<=23) {...} 

Cảm ơn bạn đã xem qua.

+1

Bạn đã thử chưa? Nó sẽ hoạt động tốt. Chỉ cần cẩn thận bạn không tạo lại nhiều trường hợp 'ngẫu nhiên' trong một cửa sổ thời gian ngắn, hoặc chúng sẽ trả lại kết quả" ngẫu nhiên "tương tự. – mellamokb

+0

Tôi không muốn sử dụng từ 1 đến 4 vì tôi muốn chỉnh sửa sau này nếu cần thiết, nhưng có, 1,4 sẽ giống nhau. Cảm ơn Scott, tôi đã bỏ lỡ điều đó. – CdrTomalak

+0

Điều đó nghe có vẻ đúng. –

Trả lời

5

Đối số thứ hai của Next(int, int)exclusive upper bound trong phạm vi kết quả mong muốn. Do đó bạn nên sử dụng này:

if (random.Next(0, 100) < 25) 

hoặc, nếu bạn phải sử dụng logic 1 có trụ sở,

if (random.Next(1, 101) <= 25) 
+0

Điều này thật thú vị, như tôi đã nghĩ tôi có thể thử và kích hoạt 25% cơ hội khác bằng cách sử dụng cùng một số ngẫu nhiên thông qua: 'if ((rand> 25) && (rand <= 50)) {...}. Nhưng tôi đoán chỉ có một loạt các báo cáo nếu bạn đề nghị sẽ làm việc chỉ là tốt? – CdrTomalak

+0

@CdrTomalak không hoạt động. Nếu sự kiện đầu tiên của bạn * được * gọi, xác suất gọi sự kiện tiếp theo là số không. Nếu sự kiện đầu tiên là * not * được gọi, xác suất gọi sự kiện tiếp theo là 1/3.Nếu bạn sử dụng lại số ngẫu nhiên, các sự kiện sẽ không còn độc lập ngẫu nhiên nữa; vì sẽ không có cách nào mà cả hai sự kiện có thể xảy ra. – phoog

+0

@CdrTomalak nếu, mặt khác, bạn muốn chọn một trong bốn sự kiện một cách ngẫu nhiên, bạn đang đi đúng hướng; bạn cần sử dụng 'if (rand> = 25 && rand <50)' cho các số không dựa trên, bởi vì giới hạn dưới bao gồm, và giới hạn trên bao gồm. Đối với các số 1, biểu thức của bạn sẽ chính xác. – phoog

8

Lỗi lớn nhất mà bạn đang làm là nó phải được random.Next(0,100) như documentation states

minGiá trị: Giá trị giới hạn dưới của số ngẫu nhiên được trả về.

maxValue: độc quyền giới hạn trên của số ngẫu nhiên được trả về. maxValue phải lớn hơn hoặc bằng minValue.

Mỏ emphisis, độc quyền có nghĩa là nó không bao gồm số bạn đã nhập, vì vậy mã của tôi tạo phạm vi 0-99 và mã của bạn tạo phạm vi 1-99.

Vì vậy, thay đổi mã của bạn để

int rand = random.Next(0,100) 

if (rand < 25) //25% 
{ 
    // Some event... 
} 

//other code 
if (rand < 23) //23% 
{ 
    // Some event... 
} 

Sự thay đổi <=-< là bởi vì bạn hiện đang sử dụng các giới hạn trên độc quyền dao

5

Bạn cũng có thể sử dụng mã này (thường là để tính toán tỷ lệ phần trăm đôi giữa 0 và 1 được sử dụng):

double rand = random.NextDouble(); 
if(rand < .25) 
{ 
... 
+0

Điều đó phải là 'if (rand <.25)'; giới hạn trên là độc quyền: http://msdn.microsoft.com/en-us/library/system.random.nextdouble.aspx – phoog

+0

Cảm ơn bạn. Tôi đã chỉnh sửa câu trả lời của tôi nếu bạn không nhớ. Nhưng đối với gấp đôi nó không tạo ra nhiều khác biệt. (Sự khác biệt chỉ khi các số như 0.249999999 ... và 0,25 đi vào, không làm hỏng hình ảnh của 1/4 xác suất) –

+0

Vâng, sự khác biệt là rất nhỏ (tác động chính xác tùy thuộc vào số lượng các hàm giá trị rời rạc của hàm NextDouble có thể trở lại, tất nhiên). Tôi cho rằng nếu thuật toán nhạy cảm đến mức điều này tạo ra sự khác biệt, thì nó nên sử dụng số ngẫu nhiên đúng hơn là số giả ngẫu nhiên ngay từ đầu. – phoog