Math.random() – 不随机

我创建了一个jQuery插件,但我有一个问题,我使用以下代码:

Math.floor(Math.random()*500) 

我将结果添加到元素中,但奇怪的是结果每次都相同。

如果我在随机数生成后向行添加alert(),我会得到随机值,为什么? 我想得到没有alert()随机整数。 但是怎么样?

随机数函数是模拟随机的方程,但它仍然是一个函数。 如果你给它相同的种子,第一个答案将是相同的。

你可以尝试更改种子,并在首次加载javascript时执行此操作,这样如果随机数生成器有一个时间组件,那么它可以使用加载页面的延迟来更多地随机化数字。

但是,你可能想要改变种子。 您可以使用Date()函数,然后获取毫秒并将其用作种子,这可能有助于首先加扰它。

我认为生成器有一个时间组件是它随着警报而改变的事实,因为在生成下一个数字时会延迟,尽管我没有测试过这个。

更新:

我意识到规范声明Math.random没有参数,但是有一个种子被使用。

我来自C,然后是Java,因此使用参数没有错误的事实让我认为它使用了它,但现在我发现这是不正确的。

如果你真的需要一颗种子,最好的办法就是写一个随机数生成器,然后Knuth书就是最好的起点。

这就是我根据自己的需求解决的问题。 在我的情况下,它工作正常,因为我只会偶尔请求数字,而不是顺序或循环。 如果你在循环中使用它,这将无法工作,因为它是基于时间的,循环将执行几毫秒的请求。

 function getRandomNumber(quantity_of_nums){ var milliseconds = new Date().getMilliseconds(); return Math.floor(milliseconds * quantity_of_nums / 1000); } 

这将为您提供从0到quantity_of_nums – 1的数字

希望能帮助到你!

随机数生成器实际上是伪随机数生成器 – 即它们使用公式来计算实际上随机的数字流。

因此,对于相同的初始输入值(种子),您将获得相同的流。 因此,诀窍是使用一个好的实际随机种子为随机数生成器播种。

因此,您需要以某种方式将种子传递给random() – 您可以使用当前时间的某种散列,或者您认为具有某种随机性的任何其他数据(如果您希望它“安全随机” – 这是一个完整的其他主题,可能涵盖在其他地方)。

所以使用类似: Math.random(Date.getMilliseconds()) – 可能更接近你想要的。

你可以用

 #include  

然后获得一系列种子,范围从0到999,999,使用

 gettimeofday(&tv, NULL); srand(tv.tv_usec); 

然后,要获得0 – 499范围内的随机数,请使用

 r = 500*((double)rand() /((double)(RAND_MAX)+(double)(1.0)))); 

或者将1添加到此结果中以将其移至范围1 – 500。

祝好运