【问题标题】:Random Numbers Generator based on Current Time and Birth Date基于当前时间和出生日期的随机数生成器
【发布时间】:2015-08-25 09:08:37
【问题描述】:

我开始学习 JavaScript,发现这篇文章:http://michalbe.blogspot.ro/2011/02/javascript-random-numbers-with-custom.html

我喜欢自定义种子编号生成器的想法,但我看在 Thor 的份上,无法弄清楚,如果更简单的话,我真的需要一个用纯 javascript 或 jQuery 之类的库完成的实际示例。

我们开始:

所以我想要生成由“-”(减号)分隔的 10 个不同的数字,每个数字的范围为 1-50,我希望每个数字的种子通过乘以 2 来组成:

  1. 以尽可能大的数字序列表示当前时间(每个数字延迟 1 秒,因此时间会有所不同)
  2. 您的出生日期(来自 3 个选择输入)

[!] 另外我想知道我们如何以不同的方式为这 10 个数字的生成设置动画,例如...例如旧火车站到达/出发机械显示器的动画,或者喜欢不同的 HTML5 画布粒子技术或 CSS3 或其他任何东西。 - 如果您认为太多,可以在另一个问题中完成。

如果你能帮我解决这个问题,我将永远感激不尽!

谢谢!

var CustomRandom = function(nseed) {    
  
  var seed,    
    constant = Math.pow(2, 13)+1,    
    prime = 1987,    
//any prime number, needed for calculations, 1987 is my favorite:)  
    maximum = 50;    
//maximum number needed for calculation the float precision of the numbers (10^n where n is number of digits after dot)  
    if (nseed) {    
      seed = nseed;    
    }    
    
    if (seed == null) {    
//before you will correct me in this comparison, read Andrea Giammarchi's text about coercion http://goo.gl/N4jCB  
      
      seed = (new Date()).getTime();   
//if there is no seed, use timestamp     
    }     
    
    return {    
      next : function(min, max) {    
        seed *= constant;    
        seed += prime;    
           
      
        return min && max ? min+seed%maximum/maximum*(max-min) : seed%maximum/maximum;  
// if 'min' and 'max' are not provided, return random number between 0 & 1  
      }    
    }    
}

var rng = CustomRandom(09031887);
//use '09031887' as a seed ?
    rng.next();
    rng.next();
});
<b>Your birth date:</b><br>
Day: 
<select id="day">
<option selected="selected">01</option>
<option>02</option><option>03</option><option>04</option><option>05</option><option>06</option><option>07</option><option>08</option><option>09</option><option>10</option><option>11</option><option>12</option><option>13</option><option>14</option><option>15</option><option>16</option><option>17</option><option>18</option><option>19</option><option>20</option><option>21</option><option>22</option><option>23</option><option>24</option><option>25</option><option>26</option><option>27</option><option>28</option><option>29</option><option>30</option><option>31</option>
</select>
Month:
<select id="month">
<option selected="selected">01</option>
<option>02</option><option>03</option><option>04</option><option>05</option><option>06</option><option>07</option><option>08</option><option>09</option><option>10</option><option>11</option><option>12</option>
</select>
Year: 
<select id="year">
<option selected="selected">1998</option>
<option>1997</option><option>1996</option><option>1995</option><option>1994</option><option>1993</option><option>1992</option><option>1991</option><option>1990</option><option>1989</option><option>1988</option><option>1987</option><option>1986</option><option>1985</option><option>1984</option><option>1983</option><option>1982</option><option>1981</option><option>1980</option><option>1979</option><option>1978</option><option>1977</option><option>1976</option><option>1975</option><option>1976</option><option>1975</option><option>1976</option>
</select>
<br><br>

<span id="nr1"></span> - 
<span id="nr2"></span> - 
<span id="nr3"></span> - 
<span id="nr4"></span> - 
<span id="nr5"></span> - 
<span id="nr6"></span> - 
<span id="nr7"></span> - 
<span id="nr8"></span> - 
<span id="nr9"></span> - 
<span id="nr10"></span>
<br><br>

<button>Generate</button>

【问题讨论】:

  • 问题到底出在哪里?到目前为止你尝试了什么?发布一个 jsfiddle
  • 在一个范围内创建一个随机整数很简单Math.random,但正如您所见,没有办法用这个内置函数控制seed。现代的Crypto.getRandomValues 也是如此,如果seed 是必须的,那么您将不得不查看第三方库(或自己编写)。
  • 我还没有设法使文章中的那个工作,所以我真的没有任何东西,我只有一些用于输出的 HTML。这就是为什么我要一个实际的例子:(
  • 向我们展示您无法开始工作的代码,以及似乎出了什么问题,然后我们可以就如何纠正它为您提供建议。
  • 这是我所拥有的:jsfiddle.net/cunuqq7h

标签: javascript random numbers generator seed


【解决方案1】:

这与我使用 David Bau 的脚本 (seedrandom.js) 得到的一样接近:

<script src="//cdnjs.cloudflare.com/ajax/libs/seedrandom/2.4.0/seedrandom.min.js">
</script>
<b>Your birth date:</b><br>
Day: 
<select id="day">
<option selected="selected">day</option><option value="1">01</option><option value="2">02</option><option value="3">03</option><option value="4">04</option><option value="5">05</option><option value="6">06</option><option value="7">07</option><option value="8">08</option><option value="9">09</option><option>10</option><option>11</option><option>12</option><option>13</option><option>14</option><option>15</option><option>16</option><option>17</option><option>18</option><option>19</option><option>20</option><option>21</option><option>22</option><option>23</option><option>24</option><option>25</option><option>26</option><option>27</option><option>28</option><option>29</option><option>30</option><option>31</option>
</select>
Month:
<select id="month">
<option selected="selected">month</option><option value="1">01</option><option value="2">02</option><option value="3">03</option><option value="4">04</option><option value="5">05</option><option value="6">06</option><option value="7">07</option><option value="8">08</option><option value="9">09</option><option>10</option><option>11</option><option>12</option>
</select>
Year: 
<select id="year">
<option selected="selected">year</option><option>2015</option><option>2014</option><option>2013</option><option>2012</option><option>2011</option><option>2010</option><option>2009</option><option>2008</option><option>2007</option><option>2006</option><option>2005</option><option>2004</option><option>2003</option><option>2002</option><option>2001</option><option>2000</option><option>1999</option><option>1998</option><option>1997</option><option>1996</option><option>1995</option><option>1994</option><option>1993</option><option>1992</option><option>1991</option><option>1990</option><option>1989</option><option>1988</option><option>1987</option><option>1986</option><option>1985</option><option>1984</option><option>1983</option><option>1982</option><option>1981</option><option>1980</option><option>1979</option><option>1978</option><option>1977</option><option>1976</option><option>1975</option><option>1976</option><option>1975</option><option>1976</option><option>1975</option><option>1974</option><option>1973</option><option>1972</option><option>1971</option><option>1970</option><option>1969</option><option>1968</option><option>1967</option><option>1966</option><option>1965</option><option>1964</option><option>1963</option><option>1962</option><option>1961</option><option>1960</option>
</select>

<br><br>

<span id="nr1"></span> / 
<span id="nr2"></span> / 
<span id="nr3"></span> / 
<span id="nr4"></span> / 
<span id="nr5"></span> / 
<span id="nr6"></span> / 
<span id="nr7"></span> / 
<span id="nr8"></span> / 
<span id="nr9"></span> / 
<span id="nr10"></span>
<br><br>

<button onclick="generate()">Generate</button>

<script type="text/javascript">
function generate() {
    // get user's birth date as a number
    var day = (document.getElementById("day").value);
    var month = (document.getElementById("month").value);
    var year = (document.getElementById("year").value);
    var dob = (day+month+year);

    //check if user specified dob
    if(isNaN(day) || isNaN(month) || isNaN(year))
   {
    alert("Check your birth date!");
   }
    else {
    // Sets Math.random to an ARC4-based PRNG that is autoseeded using the
    // current time, dom state, and other accumulated local entropy.
    // The generated seed string is returned.
    Math.seedrandom();

    //the custom seed is the user's dob
    nr1.textContent = (Math.random(dob));
    nr2.textContent = (Math.random(dob));
    nr3.textContent = (Math.random(dob));
    nr4.textContent = (Math.random(dob));
    nr5.textContent = (Math.random(dob));
    nr6.textContent = (Math.random(dob));
    nr7.textContent = (Math.random(dob));
    nr8.textContent = (Math.random(dob));
    nr9.textContent = (Math.random(dob));
    nr10.textContent = (Math.random(dob));
   }
}
</script>

我现在需要的只是将所有数字转换为从 1 到 50 的整数(类似于 min max)。有谁知道怎么做? > 随意使用:https://jsfiddle.net/cunuqq7h/9/

【讨论】:

    【解决方案2】:

    如果您在提供的代码中修复了SyntaxError,则 Javascript 代码实际上可以工作。不过,您没有任何事件处理程序可以使用您提供的 HTML 来控制它。

    var CustomRandom = function (nseed) {
        var seed,
            constant = Math.pow(2, 13) + 1,
            prime = 1987,
            //any prime number, needed for calculations, 1987 is my favorite:)  
            maximum = 50;
            //maximum number needed for calculation the float precision of the numbers (10^n where n is number of digits after dot)  
        
        if (nseed) {
            seed = nseed;
        }
    
        if (seed == null) {
            //before you will correct me in this comparison, read Andrea Giammarchi's text about coercion http://goo.gl/N4jCB  
            seed = (new Date()).getTime();
            //if there is no seed, use timestamp     
        }
    
        return {
            next: function (min, max) {
                seed *= constant;
                seed += prime;
    
                return min && max ? min + seed % maximum / maximum * (max - min) : seed % maximum / maximum;
                // if 'min' and 'max' are not provided, return random number between 0 & 1  
            }
        }
    }
    
    var rng = CustomRandom(09031887),
        //use '09031887' as a seed ?
        pre = document.getElementById('out');
    
    pre.textContent += rng.next() + '\n';
    pre.textContent += rng.next();
    &lt;pre id="out"&gt;&lt;/pre&gt;

    A further example of using the library that you linked to.

    Math.seedrandom(09031887);
    //use '09031887' as a seed ?
    
    var pre = document.getElementById('out');
    
    pre.textContent += Math.random() + '\n'; // output always 0.21968861683194144
    pre.textContent += Math.random(); // output always 0.9079655673042485
    <script src="//cdnjs.cloudflare.com/ajax/libs/seedrandom/2.4.0/seedrandom.min.js"></script>
    <pre id="out"></pre>

    【讨论】:

    • 非常不错的 Xotic,我真的很欣赏修复代码,这改变了很多,但我仍然需要改变一些东西。 1.第一个是包含当前时间并将其与种子相乘,而不是将其用作“如果”。 2.第二个是将后面的每个数字延迟1秒,这样当前时间就会不同。
    • 另外,CustomRandom 的值 09031887 是我的出生日期,我不确定它是否应该放在哪里。我需要数字是从 1 到 50 的整数。
    • 我尝试了第一个答案,您修复了代码,但它只是一遍又一遍地生成数字 0.56。
    • 如果你在每一代都使用相同的seed,它会。
    • 是的,正确,但我想做的是根据我们这样获得的种子(当前时间 * 出生日期)获得不同的数字,例如:13:05:34 * 9 /3/1987 我们这样写:130534 * 931987。这是一个例子。如果我们将每个不同数字的脚本运行延迟 1 秒,我们会得到不同的结果。
    猜你喜欢
    • 2011-04-01
    • 1970-01-01
    • 2013-02-05
    • 2013-05-10
    • 2012-01-31
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 2019-07-26
    相关资源
    最近更新 更多