使用 crypto.getRandomValues() 生成 0 到 1 的随机数

2024-05-01

看起来 Math.random() 会生成 [0,1) 范围内的 64 位浮点数,而新的 crypto.getRandomValues() API 仅返回整数。使用此 API 生成 [0,1) 中的数字的理想方法是什么?

这似乎有效,但似乎不太理想:

ints = new Uint32Array(2)
window.crypto.getRandomValues(ints)
return ints[0] / 0xffffffff * ints[1] / 0xffffffff

编辑:为了澄清,我正在尝试制作better结果优于 Math.random()。根据我对浮点的理解,应该可以获得 52 位随机性的完全随机分数。 (?)

编辑2:为了提供更多背景知识,我并不想做任何加密安全的事情,但有很多关于 Math.random() 实施不佳的轶事故事(例如http://devoluk.com/google-chrome-math-random-issue.html http://devoluk.com/google-chrome-math-random-issue.html)所以如果有更好的替代方案,我想使用它。


请记住,浮点数只是一个mantissa系数,乘以 2 得出exponent:

floating_point_value = mantissa * (2 ^ exponent)

With Math.random,您生成具有 32 位随机尾数的浮点,并且always有一个指数-32,这样小数位就向左移动了 32 位,因此尾数永远不会有任何部分位于小数位左侧。

mantissa =         10011000111100111111101000110001 (some random 32-bit int)
mantissa * 2^-32 = 0.10011000111100111111101000110001

尝试跑步Math.random().toString(2)几次以验证情况是否如此。

解决方案:你可以生成一个随机的 32 位尾数并将其乘以Math.pow(2,-32):

var arr = new Uint32Array(1);
crypto.getRandomValues(arr);
var result = arr[0] * Math.pow(2,-32);
// or just   arr[0] * (0xffffffff + 1);

Note浮点不具有均匀分布(由于尾数缺乏精度,数字越大,可能的值变得越稀疏),使得它们不适合加密应用程序或需要非常强的随机数的其他领域。为此,您应该使用由提供给您的原始整数值crypto.getRandomValues().

EDIT:

JavaScript 中的尾数是 52 位,因此您可以获得 52 位的随机性:

var arr = new Uint32Array(2);
crypto.getRandomValues(arr);

// keep all 32 bits of the the first, top 20 of the second for 52 random bits
var mantissa = (arr[0] * Math.pow(2,20)) + (arr[1] >>> 12)

// shift all 52 bits to the right of the decimal point
var result = mantissa * Math.pow(2,-52);

所以,总而言之,不,这并不比您自己的解决方案短,但我认为这是您希望做的最好的事情。您必须生成 52 个随机位,这些随机位需要从 32 位块构建,然后需要移回到 1 以下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 crypto.getRandomValues() 生成 0 到 1 的随机数 的相关文章

  • 将 HTML 表格结构复制到剪贴板

    我只是在寻找这方面的建议 我一直在互联网上寻找可能的解决方案 了解如何将 HTML 表格结构及其文本复制到剪贴板 但到目前为止还没有那么幸运 我现在拥有的是一个包含数据的简单表格 用户需要在复制 粘贴时使用 Outlook 将其复制到电子邮
  • 如何使用 jasmine.js 测试控制台输出?

    我正在研究文本 面向 Web 开发人员的专业 JavaScript 作者 Nicholas Zakas我正在使用 Jasmine js 测试这些示例 目前 我可以通过指定返回值来测试函数的输出 但是当我想要返回多条数据时 我会遇到麻烦 教科
  • 在 Firefox 中访问全局事件对象

    目标 运行一些函数 ajaxStart 但仅限于由特定事件触发时 代码 loading indicator ajaxStart function if event null if event type hashchange event ty
  • 从 javascript 调用 HttpHandler

    我有一个简单的页面 带有通过 JavaScript 调用 HttpHandler 的按钮 HttpHandler 获取大量文件并将它们添加到 zip 文件中 完成工作后 zip 文件将添加到 Response 中 此操作可能需要几分钟时间
  • 旋转嵌套 SVG

    我在用SVG js http svgjs com并尝试使用 SVG 进行一些操作 我以前使用过 canvas 但我对其生成的图像质量非常失望 因此我决定使用纯 SVG 我设法将所有内容都改为纯 SVG 方法 除了一件事 旋转 我无法让它发挥
  • Xhr上传event.loaded问题

    opts xhr function var xhr new window XMLHttpRequest Upload progress xhr upload onprogress function e if e lengthComputab
  • JavaScript 计算从今天到 7 天前的日期

    我正在计算从今天开始的日期前 12 天 但它不会返回正确的日期 例如 对于今天的日期 11 11 2013 mm dd yyyy 它返回 10 30 2013 而它应该返回 10 31 2013 这是代码 var d new Date d
  • 等待两个异步函数完成,然后在 Node.js 中继续

    我正在 Node js 中开发一个应用程序 其中调用异步函数两次 并将值分配给全局变量 问题是我想使用这两个调用的结果来做其他事情 但是这个其他事情不会等待结果被分配 这是我的代码 var a var b let x abcd foo x
  • jQuery的$如何既是函数又是对象?

    我的意思是对象 object Object 它是怎么做的 selector and fn init同时 你能给我一个简单的例子吗 这并不是 jQuery 独有的 而是 javascript 的一个方面 所有函数都是对象 例如 var f f
  • jQuery 显示隐藏左侧滑动面板

    我希望在单击按钮时面板从浏览器的左边缘滑动 并在单击同一按钮 切换 时隐藏面板 Html div class panel div a href class slider arrow show raquo a CSS panel width
  • 过滤文件上传仅用于文本文件

    我使用的是 Firefox 版本 14 0 1 我需要过滤上传文件窗口以仅显示 txt files 我的浏览器不仅仅支持文本文件 text plain 我可以通过指定此格式来限制图像文件 image 但我只需要过滤文本文件在文件选择器窗口中
  • 如何让 jQuery 选择带有 . (句号)在他们的身份证件中?

    给定以下类和控制器操作方法 public School public Int32 ID get set publig String Name get set public Address Address get set public cla
  • 指令可以从父作用域中删除自身吗

    假设我有以下代码 div div div div 我的自定义指令有一个独立的范围 定义为 app directive customDirective function log return restrict E templateUrl te
  • IE7 真的不支持indexOf javascript 吗? [复制]

    这个问题在这里已经有答案了 可能的重复 数组上的 indexOf 函数在使用 JavaScript 的 IE7 8 中不起作用 https stackoverflow com questions 11544983 indexof funct
  • 为什么我会失去对元素的引用?

    我偶然发现了一些奇怪的东西 至少对我来说 案例如下 我选择一个元素 child1 从 DOM 并将其保存到变量中 我继续添加一个新元素child1的家长 parent1 现在 如果我尝试修改某些值child1它不记录更改 似乎引用已经消失
  • 如何检查浏览器中消失的元素?

    How can I inspect an element which disappears when my mouse moves away 我不知道它的 ID 类别或其他任何信息 但想检查它 我尝试过的解决方案 在控制台内运行 jQuer
  • JSON.stringify 对于大型对象来说非常慢

    我在 javascript 中有一个非常大的对象 大约 10MB 当我对其进行字符串化时 需要很长时间 因此我将其发送到后端并将其解析为一个对象 实际上是带有数组的嵌套对象 这也需要很长时间 但这不是我们在这个问题中的问题 问题 我怎样才能
  • HighCharts - 两个 Y 轴,一个具有最大值

    我在使用 Highcharts 时遇到问题 我已将右 Y 轴设置为 min 0 和 max 100 它是 但它不起作用并生成 125 百分比 怎么了 http jsfiddle net SdTcU http jsfiddle net SdT
  • 只允许在输入字段中输入数字

    我想要打开电话号码字段这个网站 http myfrugaltech com dev savoo register 只接受数字或数字 我无权编辑 HTML 代码 那么可以使用 jQuery 通过定位字段 ID 来完成此操作吗 如果可以的话 该
  • 解析函数是否异步传递给 Promise 执行器?

    我有以下代码 function myPromiseFunc return new Promise resolve gt resolve Promise resolve 123 据我们所知Promise resolve方法立即用普通值解析 P

随机推荐

  • 定期运行 python 程序作为 firebase 中的后台服务

    刚开始使用 firebase React 来构建一个网站 我网站的设计功能之一是抓取并向用户显示从另一个网站解析的数据 例如股票价格变化 我已经有一个 python 爬虫负责解析数据 但我不知道如何在 firebase 中执行我的服务器的这
  • 循环遍历文件扩展名,excel vba

    我正在使用文件扩展名数组并循环访问工作簿文件夹 该代码正在命名 Sheet 1 name MyName 我注意到尽管 xlsm 不在数组中 它仍在打开并命名工作表 这是代码 任何人都可以看看他们是否遇到同样的问题并且能够解决它 Sub Lo
  • 如何创建设置为太平洋标准时间午夜的 DateTimeOffset

    我正在使用 Quartz NET http quartznet sourceforge net http quartznet sourceforge net 我试图将开始日期设置在午夜 但我在创建这个日期时遇到问题 该应用程序将位于不同时区
  • 如何在自动完成地点中获取城市和州名称 _ Places API

    我正在使用地点自动完成功能从用户中选择城市 其工作正常 但现在我想要城市和州名 我的代码 正在初始化 List
  • 如何在 git 中使用 --work-tree 选项?我不断收到错误消息

    我有一个普通的存储库 其中有一个工作树和一个与工作树位于同一目录中的 git 文件夹 我正在尝试使用以下命令从该位置外部运行 git 命令 git git dir path to repo git work tree path to rep
  • 使用 ajax 渲染部分视图

    我查过这个问题 https stackoverflow com questions 4888521 asp net mvc3 razor views and partialviews with ajax postbacks它解决了我最初的问
  • Java EE 6 中的多租户支持

    我有一个现有的 Java EE 6 应用程序 部署在 Glassfish v 3 1 中 并且希望支持多个租户 我当前在应用程序中使用的技术 API 是 EJB 包括EJB定时器服务 JPA 2 0 EclipseLink JSF 2 0
  • 高级自定义字段 – 具有多个输入的自定义字段类型

    我正在尝试为 ACF 创建一个新的字段类型 其中包含多个输入或存储值数组 原因是我希望为一组输入字段提供一些交互性和自定义布局 我按照这个教程http www advancedcustomfields com resources tutor
  • 在 jQuery 中从 asp.net runat 服务器获取 ID

    我正在尝试使用 ASP NET 在 jQuery 中制作一些东西 但身份证来自runat server 与 HTML 中使用的 id 不同 我曾经用它来从这种情况中获取ID val 但在这种情况下 它不起作用 我不知道为什么 JavaScr
  • Neo4j 2.0 唯一约束错误“节点已存在”,当它不存在时

    我在 Neo4j 唯一约束方面遇到了一些麻烦 其中 CREATE cypher 语句由于节点已经存在而无法执行 问题是 它不 存在 此外 昨天使用这些确切数据的精确流程也有效 我的neo4j版本是ubuntu 12 04 3上的commun
  • Javascript 'this' 覆盖 Z 组合器和所有其他递归函数

    背景 我有一个由a实现的递归函数Z 组合器如图所示here https stackoverflow com questions 17645356 anonymous recursion any way to replace javascri
  • WScript.Shell.Exec - 从 stdout 读取输出

    我的 VBScript 不显示我执行的任何命令的结果 我知道命令被执行 但我想捕获结果 我已经测试了多种方法来执行此操作 例如以下方法 Const WshFinished 1 Const WshFailed 2 strCommand pin
  • 测试抽象模型 - django 2.2.4 / sqlite3 2.6.0

    我正在尝试使用 django 2 2 4 sqlite3 2 6 0 python 3 6 8 测试一些简单的抽象混合 目前 我在使用架构编辑器从测试数据库中删除模型时遇到问题 我有以下测试用例 from django test impor
  • Web 服务版本控制策略的优缺点

    更新20100224 我真的不需要某些供应商网站上的一些蹩脚定义 我正在寻找的是实际实施以及实际实施这些东西的人们在日常 IT 业务周期中面临的挑战 更多内容如下 尚未制定 采用任何退休策略 显然需要制定一项策略 我对您如何制定该战略并将其
  • 矩形相当于文本的文本锚点表示属性吗?

    是否有一个与文本的文本锚点表示属性等效的矩形 我希望能够从左侧 右侧或根据情况定位矩形 我知道这可以通过一些简单的计算来完成 但我只是想知道是否已经存在内置的东西 文本锚点演示属性上的链接 https developer mozilla o
  • Shutil.rmtree() 引发异常 WindowsError:访问被拒绝:

    尝试使用 python 脚本自动删除文件 我得到 Traceback most recent call last Python script 5 line 8 in
  • 减少 CSS 网格中的行间距

    我想知道如何减少行间距 我尝试过将边距和填充设置为 0 但似乎没有什么效果 左侧为桌面视图 右侧为移动视图 content margin 0 padding 0 width 100 display grid grid gap 5px gri
  • 优化spark sql中分区数据写入S3

    我在每个 Spark 作业运行中从 HDFS 读取大约 700 GB 的数据 我的工作读取这些数据 过滤大约 60 的数据 将其分区如下 val toBePublishedSignals hiveCtx sql some query toB
  • 使用 PLINQ 扩展时是否会传输线程标识?

    我正在使用 AsParallel ForAll 在 ASP NET 请求上下文中并行枚举集合 枚举方法依赖于System Threading Thread CurrentPrincipal 我是否可以依赖用于将 System Threadi
  • 使用 crypto.getRandomValues() 生成 0 到 1 的随机数

    看起来 Math random 会生成 0 1 范围内的 64 位浮点数 而新的 crypto getRandomValues API 仅返回整数 使用此 API 生成 0 1 中的数字的理想方法是什么 这似乎有效 但似乎不太理想 ints