【问题标题】:How to convert a date into a random index in a list?如何将日期转换为列表中的随机索引?
【发布时间】:2019-07-21 19:54:54
【问题描述】:

我需要从列表中生成随机项目的东西,但该项目每天都是随机的,并且对所有用户都是一致的。这是在网站上,因此使用 JavaScript(虽然我真的只需要您遵循的算法,不一定代码本身)。

我在变量中存储了日、月和年,但是我可以做些什么来将其转换为 0 和列表长度之间的整数?

谢谢!

【问题讨论】:

    标签: javascript html date random indexing


    【解决方案1】:

    简单算法:

    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();
    }
    

    【讨论】:

    • 好吧,哇,有很多我不明白的东西。 JS中有没有简单的配对方法?它似乎没有数学函数。另外,我如何使用这个种子号码生成器?如何将其合并到我的代码中?
    • 所以我理解并实现了前半部分 - 我有种子,使用 CodePen 今天的日期为 2091584116531。这只是我不遵循的第二位,使用种子随机函数JavaScript 中实际上并不存在,但可以从这个 David Bau 家伙那里获得。我将如何真正使种子随机函数工作?
    • 如果我是你,我会使用你拥有的种子 int,并使用带有数组长度的模运算符,以获得快速、简单的伪随机值
    • 这很有道理 Tobiq,如果你放弃线程或者我想不出其他任何东西,那是我的计划。你知道这个伪随机值有多伪吗?与我以不同的方式相比,它是否明显?
    • @Harry 不幸的是我不知道。但是,除非您使用长度为数百万的大型数组,否则它似乎应该是非常随机的。我将编辑我的答案以包含有关随机播种的信息
    【解决方案2】:

    您可以使用此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>

    【讨论】:

    • 没有解释如何从日期到数组的对应(但看似随机)元素。这只是使用字符串日期(未提供)作为种子生成一系列数字。
    • 我加了一个例子。
    猜你喜欢
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 2016-04-26
    • 2014-02-16
    • 1970-01-01
    • 2021-06-21
    • 2017-06-17
    • 1970-01-01
    相关资源
    最近更新 更多