希望有人能提供帮助或建议。我在javascript中工作,代码将为我挑选一个随机数,但我需要每周存储这个数字,另外,不要让代码在下个星期选择相同的数字。此外,我将希望每周被挑选的号码显示在网站上。
就目前情况而言,代码选择随机数,但是数组总是给我多个数字,而不是存储函数为我选择的数字。
function getRndId() {
return Math.floor(Math.random() * (0, 5554));
}
document.getElementById("random_number").innerHTML = getRndId();
const IdArray = [];
for (let i = -1; i<getRndId(); i++) {
if (!IdArray.includes(getRndId())) {
IdArray.push(getRndId());
}
}
document.getElementById("Picked_numbers").innerHTML = IdArray;
发布于 2022-11-06 12:46:04
通常情况下,JavaScript Math.random()
是不可种的。多亏了David的seedrandom.js库,您现在可以为随机数生成播撒种子,从而使其可复制。在随机数序列中避免重复最有效的方法是使用混叠数组。在下面的片段中,我使用了杜斯滕菲尔德洗牌。
当前年份内的周数可以通过getWeekNumber(d)计算。
function shuffle(a){ // Durstenfeld shuffle
for(let j,i=a.length;i>1;){
j=Math.floor(Math.random()*i--);
if (i!=j) [a[i],a[j]]=[a[j],a[i]]
}
return a
}
function getWeekNumber(d) { // get current week within calendar year
// Copy date so don't modify original
d = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()));
// Set to nearest Thursday: current date + 4 - current day number
// Make Sunday's day number 7
d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay()||7));
// Get first day of year
var yearStart = new Date(Date.UTC(d.getUTCFullYear(),0,1));
// Calculate full weeks to nearest Thursday
var weekNo = Math.ceil(( ( (d - yearStart) / 86400000) + 1)/7);
// return year-2020 and week number as an array
return [d.getFullYear()-2020,weekNo];
}
Math.seedrandom("start"); // random sequence is now reproducible!
const [year,wk]=getWeekNumber(new Date()), week=53*year+wk,
arr=shuffle([...Array(5555).keys()].slice(1)); // array with 5554 elements
console.log(`Last week's random number is ${arr[week-1]}.`);
console.log(`The random number for week no ${wk} is ${arr[week]}.`);
console.log(`Next week's random number is ${arr[week+1]}.`);
<script src="https://cdnjs.cloudflare.com/ajax/libs/seedrandom/2.3.10/seedrandom.min.js"></script>
一些进一步的细节:
函数getWeekNumber()
返回两个数字的数组:当前年份-2020年(year
)和当前年份内的周数(wk
)。我选择将这两个数字相加,第一个数字乘以53,再加上第二个数字。这给了我在2020年1月1日后任何一周的可重复周数,我将其存储在常数week
中。
const [year,wk]=getWeekNumber(new Date()), week=53*year+wk
arr[week]
是数组arr
的索引week
的元素,是由5554个元素组成的经过洗牌的序列号数组.有了这个数组,我可以在100多年的时间内安全地生成每周可重复的随机数--不重复。
https://stackoverflow.com/questions/74339395
复制相似问题