抽奖
抽数逻辑:从 total 个中抽取不重复的 n 个数字
js
// 抽数逻辑:从 total 个中抽取不重复的 n 个数字
// 解题思路:洗牌 + 限制随机数区间,每一次抽数都有效,适合所有情况
function isolate(total = 100, n = 10) {
// 创建列表
function createList(length) {
let list = new Array(length).fill(1);
return list.map((value, index) => value + index);
}
// 创建区间内随机数
function random(min, max) {
return Math.floor(Math.random() * (max + 1 - min)) + min;
}
const ans = [];
const list = createList(total);
for (let i = 0; i < n; i++) {
// 创建随机索引 [i ~ total - 1]
let j = random(i, total - 1);
// 保存抽数
ans.push(list[j]);
// 将抽数移动到前面,避免下一次重复取值(也可以 splice 直接提取)
[list[j], list[i]] = [list[i], list[j]];
}
// return list.slice(0, n);
return ans;
}
console.log('isolate', isolate(100, 4).join());
for (let i = 0; i < 5; i++) {
const ans = isolate(10, 10);
console.log('isolate', ans.join());
}
// isolate 97,31,46,44
// isolate 8,4,1,2,7,10,3,9,5,6
// isolate 8,10,4,2,5,6,9,3,7,1
// isolate 3,9,5,1,7,4,8,6,2,10
// isolate 6,9,8,1,4,7,2,10,3,5
// isolate 9,6,10,5,3,8,1,7,2,4
// 抽数逻辑:从 total 个中抽取不重复的 n 个数字
// 解题思路:洗牌 + 限制随机数区间,每一次抽数都有效,适合所有情况
function isolate(total = 100, n = 10) {
// 创建列表
function createList(length) {
let list = new Array(length).fill(1);
return list.map((value, index) => value + index);
}
// 创建区间内随机数
function random(min, max) {
return Math.floor(Math.random() * (max + 1 - min)) + min;
}
const ans = [];
const list = createList(total);
for (let i = 0; i < n; i++) {
// 创建随机索引 [i ~ total - 1]
let j = random(i, total - 1);
// 保存抽数
ans.push(list[j]);
// 将抽数移动到前面,避免下一次重复取值(也可以 splice 直接提取)
[list[j], list[i]] = [list[i], list[j]];
}
// return list.slice(0, n);
return ans;
}
console.log('isolate', isolate(100, 4).join());
for (let i = 0; i < 5; i++) {
const ans = isolate(10, 10);
console.log('isolate', ans.join());
}
// isolate 97,31,46,44
// isolate 8,4,1,2,7,10,3,9,5,6
// isolate 8,10,4,2,5,6,9,3,7,1
// isolate 3,9,5,1,7,4,8,6,2,10
// isolate 6,9,8,1,4,7,2,10,3,5
// isolate 9,6,10,5,3,8,1,7,2,4
js
// 抽数逻辑:从 total 个中抽取不重复的 n 个数字
// 解题思路:利用哈希集合去重,运行次数可能大于 n 次,适合 total 比较大的情况
function isolate2(total = 100, n = 10) {
// 创建列表
function createList(length) {
let list = new Array(length).fill(1);
return list.map((value, index) => value + index);
}
// 创建区间内随机数
function random(min, max) {
return Math.floor(Math.random() * (max + 1 - min)) + min;
}
const ans = new Set();
const list = createList(total);
while (ans.size < n) {
const index = random(0, total - 1);
ans.add(list[index]);
}
return Array.from(ans);
}
console.log('isolate2', isolate2(100, 4).join());
for (let i = 0; i < 5; i++) {
const ans = isolate2(10, 10);
console.log('isolate2', ans.join());
}
// isolate2 50,45,8,54
// isolate2 9,2,3,8,4,7,6,1,10,5
// isolate2 6,3,4,1,10,8,2,5,7,9
// isolate2 10,2,6,4,3,7,1,8,9,5
// isolate2 1,9,8,4,5,7,10,2,3,6
// isolate2 8,10,6,9,3,1,4,7,2,5
// 抽数逻辑:从 total 个中抽取不重复的 n 个数字
// 解题思路:利用哈希集合去重,运行次数可能大于 n 次,适合 total 比较大的情况
function isolate2(total = 100, n = 10) {
// 创建列表
function createList(length) {
let list = new Array(length).fill(1);
return list.map((value, index) => value + index);
}
// 创建区间内随机数
function random(min, max) {
return Math.floor(Math.random() * (max + 1 - min)) + min;
}
const ans = new Set();
const list = createList(total);
while (ans.size < n) {
const index = random(0, total - 1);
ans.add(list[index]);
}
return Array.from(ans);
}
console.log('isolate2', isolate2(100, 4).join());
for (let i = 0; i < 5; i++) {
const ans = isolate2(10, 10);
console.log('isolate2', ans.join());
}
// isolate2 50,45,8,54
// isolate2 9,2,3,8,4,7,6,1,10,5
// isolate2 6,3,4,1,10,8,2,5,7,9
// isolate2 10,2,6,4,3,7,1,8,9,5
// isolate2 1,9,8,4,5,7,10,2,3,6
// isolate2 8,10,6,9,3,1,4,7,2,5