6年来,我的网站上有一个随机数生成器页面.很长一段时间,它是Google上"随机数生成器"的第一个或第二个结果,并且已被用于在论坛和博客上决定数十个(如果不是数百个)竞赛和绘图(我知道因为我看到了我的推荐人)网络日志,通常去看看).
今天,有人通过电子邮件告诉我,它可能不像我想的那么随机.她尝试生成非常大的随机数(例如,介于1和10000000000000000000之间),发现它们几乎总是相同的位数.实际上,我将函数包装在一个循环中,因此我可以生成数千个数字,当然,对于非常大的数字,变化只有大约2个数量级.
为什么?
这是循环版本,所以你可以自己试试:
http://andrew.hedges.name/experiments/random/randomness.html
它既包括Mozilla开发者网络的直接实现,也包括1997年我从不再存在的网页中删除的一些代码(Paul Houle的"Central Randomizer 1.3").查看源以查看每种方法的工作原理.
我在这里和其他地方读过有关Mersenne Twister的文章.我感兴趣的是为什么JavaScript的内置Math.random函数的结果没有更大的变化.谢谢!
我想生成一个随机字符串,必须有来自az和3个数字的5个字母.
我怎么能用javascript做到这一点?
我有以下脚本,但它不符合我的要求.
var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
var string_length = 8;
var randomstring = '';
for (var i=0; i<string_length; i++) {
var rnum = Math.floor(Math.random() * chars.length);
randomstring += chars.substring(rnum,rnum+1);
}
Run Code Online (Sandbox Code Playgroud) 我目前正在开发TypeScript API,它需要一些绑定到Object原型(Object.prototype)的附加功能.
请考虑以下代码:
class Foo {
}
interface Object {
GetFoo(): Foo;
GetFooAsString(): string;
}
//This is problematic...
Object.prototype.GetFoo = function() {
return new Foo();
// Note, this line is just for testing...I don't want my function to just return a blank instance of Foo!
}
//This is ok.
Object.prototype.GetFooAsString = function () {
return this.GetFoo().toString();
}
Run Code Online (Sandbox Code Playgroud)
您可能想直接在Playground尝试这个.
如你所见,我有一个叫做的类Foo(不是我将要使用的实际对象名).我还扩展了Object界面以包含两个新功能.最后我实现了针对prototype这些功能(这些工作在纯JavaScript中,它只是抱怨的TypeScript).
我在其中注释" //这是有问题的...... "TypeScript用红色波浪形突出显示,并显示以下错误:
Cannot convert '() => Foo' to '{ (): Foo; (): …Run Code Online (Sandbox Code Playgroud) 我想做一些javascript和加密的实验,我很好奇随机函数的实现有多么不可预测.有人做过任何硬测试吗?
显然,浏览器能够生成强随机性(对于ssl).问题是他们给javascript访问相同的力量.
可能重复:
在特定范围内的Javascript中生成随机数?
有人可以告诉我如何使用Math.random()或javascript中的其他方式获得一位数随机数(1,2,3,..不是0.1,0.2,..或1.0,5.0,..)?
如果您需要生成字符串/令牌来验证未来的请求(例如API密钥,电子邮件确认URL等),应考虑哪些因素?
特别是
一个实际的例子
让我们从NodeJS中获取这两个输出字符串.
字符串1(通过节点加密)
var crypto = require('crypto');
crypto.randomBytes(48, function (ex, buf) {
console.log(buf.toString('hex'));
});
Run Code Online (Sandbox Code Playgroud)
字符串2(通过节点UUID)
var uuid = require('node-uuid');
console.log(uuid.v4());
Run Code Online (Sandbox Code Playgroud)
基于上面概述的概念,哪一个更安全,为什么?
此外,请随时提出有关该主题的任何好的介绍性材料,因为我无法在网上轻松找到有关此内容的文章.
我在app.js中导入了节点模块'request',但是一旦我的脚本读了,
var request = require('request');
Run Code Online (Sandbox Code Playgroud)
它会产生如下错误.有人有想法吗?
错误信息:
[SECURITY] node-uuid:crypto不可用,回退到不安全的Math.random()
在 JavaScript 中,这个表达式会在任何浏览器中计算为 true 吗?为什么或者为什么不?
Math.random() === Math.random()
Run Code Online (Sandbox Code Playgroud)
注意:请按字面意思理解上面的代码。我不是在问 Math.random 是否会生成重复值。
注意2:没有猴子补丁
这个问题是关于 Math.random() 的内部实现,而不是关于随机数的性质。
我想使用 Firebase 制作位置难以猜测的公开可读数据。因此,为了让某人访问存储在“元素 [元素 ID = X]”中的数据,我只想向他们发送“X”,而不是向他们发送“X”以及专门为他们提供访问权限的安全令牌到元素。Firebase 的push()和childByAutoID看起来很自然:我可以授予对所有单个元素的公开读取访问权限,但拒绝公开列表。我的代码将完全没有令牌和随机数生成。自动生成的 ID 应该是唯一的,因此应该很难猜测。
从Firebase.js看来,自动生成的 ID 的前 8 个字符是基于当前时间戳的,接下来的 12 个字符是使用Math.random(). 我认为iOS的框架做同样的事情,虽然我不能看到代码,库链接到两个SecRandomCopyBytes及arc4random。
就我而言,这看起来已经足够了,但是有没有人看到 Firebase 提供的关于我们是否可以指望这种行为的指导?我不想构建假设这些名称是相对强的随机字符串的代码,然后在升级到较新版本的 Firebase 时违反了该假设。
javascript ×8
random ×5
cryptography ×2
math ×2
node.js ×2
security ×2
digit ×1
firebase ×1
interface ×1
ios ×1
object ×1
prototype ×1
token ×1
typescript ×1