<tip id='1249' />

Lấy ngẫu nhiên theo một xác suất cho trước

Thường trong các ngôn ngữ lập trình đều cung cấp các hàm trả về một số ngẫu nhiên (c, c++: rand(); .NET: class System.Random; Java: class java.util.Random; php: rand(); javascript: Math.random() …). Các số ngẫu nhiên trả về có xác suất trải đều từ min-value đến max-value.
Nếu bạn muốn lấy về một số ngẫu nhiên từ min-value đến max-value mà theo một xác suất cho trước thì bạn có thể làm như sau:

Giả sử cần lấy ngẫu nhiên từ 1 đến 4: A = [1, 2, 3, 4] sao cho xác suất lấy ra 1, 2, 3, 4 lần lượt là P = [10%, 20%, 40%, 30%].
Cách làm:
- Dùng hàm lấy ngẫu nhiên một số x từ 0 đến 99 (=SUM(P)-1).
- Xem xem x nằm trong khoảng nào của P thì trả về vị trí của nó tương ứng với số cần tìm.

Ví dụ:
x = 7 –> 1
x = 25 –> 2
x = 35 –> 3
x = 68 –> 3
x = 76 –> 4

Mẫu viết bằng javascript

var a = [1, 2, 3, 4];
var p = [10, 20, 40, 30];
var sum = 0;
for (var i = 0; i < p.length; i++) sum += p[i];
var x = Math.random() * sum; // do Math.random() trả về số ngẫu nhiên lớn hơn hoặc bằng 0 và nhỏ hơn 1
sum = 0;
for (var i = 0; i < p.length; i++) {
	sum += p[i];
	if (x < sum) return a[i];
}
Khi trích dẫn bài viết từ tek.eten.vn, xin vui lòng ghi rõ nguồn. Chúng tôi sẽ rất cảm ơn bạn!