Trong hệ thống xổ số này, 10 số được rút ngẫu nhiên từ nhóm 1 đến 49. Người chơi chọn 5 số và giải thưởng được trao dựa trên số lượng số trùng khớp với các số đã rút.
Điều này tạo ra một động lực thú vị, nơi các giải thưởng lớn đặc biệt hiếm, trong khi các giải nhỏ hơn xuất hiện thường xuyên hơn một cách tương đối.
Xác suất P(k) để trùng khớp chính xác k số trong 5 số được tính như sau:
Trong đó:
• C(n,k) đại diện cho tổ hợp (số cách chọn k phần tử từ n)
• 5 là số lượng số người chơi chọn
• 10 là số lượng số trúng được rút
• 49 là tổng số số có thể có
P(k) = [C(5,k) × C(44,10-k)] / C(49,10)
P(3) = [C(5,3) × C(44,7)] / C(49,10)
= (10 × 38,608,020) / 8,217,822,536
≈ 386,080,200 / 8,217,822,536
≈ 0.04698 ≈ 1 trong 21.28
P(4) = [C(5,4) × C(44,6)] / C(49,10)
= (5 × 7,059,052) / 8,217,822,536
≈ 35,295,260 / 8,217,822,536
≈ 0.004295 ≈ 1 trong 233
P(5) = [C(5,5) × C(44,5)] / C(49,10)
= (1 × 1,086,008) / 8,217,822,536
≈ 1,086,008 / 8,217,822,536
≈ 0.000132 ≈ 1 trong 7,566
P(thắng) = P(3) + P(4) + P(5)
≈ 0.04698 + 0.004295 + 0.000132
≈ 0.0514 ≈ 1 trong 19.45
Điều này có nghĩa là người chơi có khoảng 5.14% cơ hội thắng bất kỳ giải thưởng nào.
/**
* Generates an array of unique random integers within a specified range in sorted order.
*
* Performed daily for draws with parameters of generateUniqueRandomSortedIntegers(10, 1, 49)
*
*
* @param {number} count - The number of unique integers to generate (must be positive)
* @param {number} min - The lower bound of the range (inclusive)
* @param {number} max - The upper bound of the range (inclusive)
* @returns {number[]} A sorted array of unique random integers
* @throws {Error} If the requested count exceeds the possible unique values in the range
* or if any parameter is invalid
*/
function generateUniqueRandomSortedIntegers(count, min, max) {
// Validate input parameters
if (!Number.isInteger(count) || !Number.isInteger(min) || !Number.isInteger(max)) {
throw new Error("All parameters must be integers");
}
if (count <= 0) {
throw new Error("Count must be a positive integer");
}
if (min > max) {
throw new Error("Minimum value cannot exceed maximum value");
}
const rangeSize = max - min + 1;
if (count > rangeSize) {
throw new Error(`Cannot generate ${count} unique numbers in range [${min}, ${max}]`);
}
// For small ranges relative to count, use Fisher-Yates shuffle algorithm
if (count > rangeSize / 2) {
const allNumbers = Array.from({length: rangeSize}, (_, i) => min + i);
// Fisher-Yates shuffle
for (let i = allNumbers.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[allNumbers[i], allNumbers[j]] = [allNumbers[j], allNumbers[i]];
}
return allNumbers.slice(0, count).sort((a, b) => a - b);
}
// For larger ranges relative to count, use Set approach
const uniqueNumbers = new Set();
while (uniqueNumbers.size < count) {
const randomNumber = Math.floor(Math.random() * rangeSize) + min;
uniqueNumbers.add(randomNumber);
}
return Array.from(uniqueNumbers).sort((a, b) => a - b);
}