【发布时间】:2019-07-21 19:54:54
【问题描述】:
我需要从列表中生成随机项目的东西,但该项目每天都是随机的,并且对所有用户都是一致的。这是在网站上,因此使用 JavaScript(虽然我真的只需要您遵循的算法,不一定代码本身)。
我在变量中存储了日、月和年,但是我可以做些什么来将其转换为 0 和列表长度之间的整数?
谢谢!
【问题讨论】:
标签: javascript html date random indexing
我需要从列表中生成随机项目的东西,但该项目每天都是随机的,并且对所有用户都是一致的。这是在网站上,因此使用 JavaScript(虽然我真的只需要您遵循的算法,不一定代码本身)。
我在变量中存储了日、月和年,但是我可以做些什么来将其转换为 0 和列表长度之间的整数?
谢谢!
【问题讨论】:
标签: javascript html date random indexing
简单算法:
Pair 3 个整数到 1:
seed = pair(day, pair(month, year))
使用此 int 为 random number generator 播种,以获得所需的随机性
seed -> [0, 1, 2, ..., array.length - 1]
index = Math.round(randomOf(seed) * (array.length - 1));
element = array[index]
这是上述配对功能的基本 javascript 实现:
function pair(x, y) { return ((x + y) * (x + y + 1)) / 2 + y; }
实现 randomOf(查看上面的“随机数生成器”链接):
randomOf(seed){
Math.seedrandom(seed);
return Math.random();
}
【讨论】:
您可以使用此https://github.com/davidbau/seedrandom。所以想法是将随机函数的种子更改为日期(可能只是月、日和年)。例如:
Math.seedrandom('August 19, 1975');
console.log(Math.random()); // 0.8213442237794714
console.log(Math.random()); // 0.9082914871756658
然后将其转换为整数,您可以使用此处描述的函数:
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min)) + min;
}
编辑:
然后例如用它来获取数组中的东西
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive
}
let arr = ['firsEl', 'secondEl', 'thirdEl', 'fourthEl'];
let d = new Date(); //get todays date
let month = d.getMonth();
let day = d.getDate();
let year = d.getFullYear();
//make the random with seed
Math.seedrandom(`${month} ${day}, ${year}`);
//and finally using the function for int
let item = arr[getRandomInt(0, arr.length)];
console.log(item);
<script src="http://cdnjs.cloudflare.com/ajax/libs/seedrandom/2.4.4/seedrandom.min.js"></script>
【讨论】: