Javascript Math.random()-不是随机的

Javascript Math.random()-不是随机的,javascript,jquery,math,random,Javascript,Jquery,Math,Random,我创建了一个jQuery插件,但我有一个问题,我使用以下代码: Math.floor(Math.random()*500) 我将结果添加到元素中, 但奇怪的是,每次的结果都是一样的 如果我在生成随机数后向该行添加alert(), 我得到随机值,为什么? 我想不使用alert()随机整数。但是怎么做呢?随机数函数是一个模拟随机性的方程,但它仍然是一个函数。如果你给它同样的种子,第一个答案将是一样的 您可以尝试更改种子,并在首次加载javascript时执行此操作,这样,如果随机数生成器中有时间组

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

Math.floor(Math.random()*500)
我将结果添加到元素中, 但奇怪的是,每次的结果都是一样的

如果我在生成随机数后向该行添加alert(), 我得到随机值,为什么?
我想不使用alert()随机整数。但是怎么做呢?

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

您可以尝试更改种子,并在首次加载javascript时执行此操作,这样,如果随机数生成器中有时间组件,则它可以使用加载页面的延迟来进一步随机数

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

我认为生成器有一个时间组件,这是因为它会随着警报而变化,因为在生成下一个数字时会延迟,尽管我还没有对此进行测试

更新:

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

我是从C和Java开始的,所以使用参数没有错误这一事实让我认为它使用了参数,但现在我发现这是不正确的


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

随机数生成器实际上是伪随机数生成器-即它们使用一个公式来计算实际上是随机的数流

因此,对于相同的初始输入值(seed),您将得到相同的流。所以,诀窍是用一个好的、实际上是随机的种子来给随机数生成器播种

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

因此,使用类似于:Math.random(Date.getmillizes())-可能更接近您想要的

您可以使用

#include <sys/time.h>
然后,要获得0-499范围内的随机数,请使用

r = 500*((double)rand() /((double)(RAND_MAX)+(double)(1.0))));
或者在这个结果上加1,将其移动到1-500的范围


祝你好运

这就是我解决问题的方法。在我的例子中,它工作得很好,因为我只会偶尔请求数字,而不会按顺序或循环。如果在循环中使用它,这将不起作用,因为它是基于时间的,并且循环将以毫秒间隔执行请求

function getRandomNumber(quantity_of_nums){
    var milliseconds = new Date().getMilliseconds();
    return Math.floor(milliseconds * quantity_of_nums / 1000);
}
这将为您提供一个从0到数量\u的数字\u nums-1


希望有帮助

我正在Firebug的JavaScript控制台中尝试您的代码,每次都会得到不同的数字。你用的是什么浏览器?你能把完整的密码寄出去吗?(也就是说,包括将结果添加到元素中)。至少,每次得到的结果是什么?你能发布插件的代码吗?在我看来,这就像是一个闭包问题……我看到过在非常紧密的循环中调用时会出现这种情况,出于某种原因,它得到了优化,总是返回相同的值,而不是重新执行调用。我已经很久没有看到它了。请大家注意CMS好吗?他可能是对的。您需要准确地发布如何将此随机数添加到元素中。嗯,根据ECMA-262规范,
Math.random()
不接受任何参数。你知道哪个浏览器
Math.random(Date.getmillizes())
工作吗?@Xavi,你是对的,上面的代码工作是因为传递给
Math.random
的参数被忽略了。。。使用固定的“种子”进行测试,IE和Firefox仍然返回随机值。Xavi是对的,参数只是被忽略了。能否将
(Math.random()+new Date().getmillizes()/1000)/2
视为“播种”?您试图“将随机性添加到结果中”,这是一个很好的想法,但有一个陷阱:两个随机数的平均分布并不均匀。用外行的话来说,这意味着,在你的建议中,得到0.5的概率比得到0.25的概率大。有关更多技术(数学)信息,请参阅:Javascript问题,而不是C/C++。我当然想知道为什么对这个答案投反对票。这是一个完整的描述,它生成了一个随机数范围,它既没有前面的答案也没有解决,因为这个问题问如何在JavaScript中生成随机数(在编写jQuery插件的上下文中),并且你的答案解释了如何在C或C++中生成随机数。我认为在C或C++中编写jQuery插件是不可能的。回答得很好,但不是针对这个问题。您无法更改Javascript中Math.random()的种子。它使用脚本开始执行时的当前时间对其进行种子设定。@Matt-我总是刚刚传入一个值,我没有意识到它被忽略。
182018221824182618261828281828183018301832
看起来不是很随机
for(i=0;i<10;i++){console.log(getRandomNumber(2000))}
Kevin B。你说得很对,如果在循环中使用它,这将不起作用,因为它是基于时间的,循环将以毫秒间隔执行请求。更改文本以澄清这一方面。谢谢你的提醒。
function getRandomNumber(quantity_of_nums){
    var milliseconds = new Date().getMilliseconds();
    return Math.floor(milliseconds * quantity_of_nums / 1000);
}