ruby - 基于 ANU 量子随机数服务器的随机数

标签 ruby random

有人要求我使用 ANU Quantum Random Numbers Service创建随机数并仅使用 Random.rand 作为后备。

 module QRandom

   def next
     RestClient.get('http://qrng.anu.edu.au/API/jsonI.php?type=uint16&length=1'){ |response, request, result, &block|
       case response.code
         when 200
           _json=JSON.parse(response)
           if _json["success"]==true && _json["data"] 
             _json["data"].first || Random.rand(65535)
           else
             Random.rand(65535) #fallback
           end
         else
           puts response #log problem
           Random.rand(65535)   #fallback
       end
     }
   end

 end

他们的 API服务给了我一个介于 0-65535 之间的数字。为了为更大的集合创建随机数,例如 0-99999 之间的随机数,我必须执行以下操作:

(QRandom.next.to_f*(99999.to_f/65535)).round 

我认为这是错误的做法,因为如果我要使用从 0-3 创建数字并将它们转置到 0-9999 空间的服务(无论是否为量子),我可以选择 4 个数字我总是得到。如何使用生成 0-65535 之间数字的服务为更大的数字集创建随机数?

最佳答案

由于 65535 在二进制中是 1111111111111111,因此您可以将随机数服务器视为随机位的来源。它以 16 位为单位向您提供位这一事实并不重要,因为您可以发出多个请求,也可以忽略响应中的某些位。

因此,在执行该抽象之后,我们现在拥有的是一项服务,可在您需要时为您提供随机位(0 或 1)。

计算出您需要多少位随机性。由于你想要一个0到99999之间的数,你只需要找到一个全为1且大于或等于99999的二进制数。十进制99999等于二进制11000011010011111,它有17位长,所以你需要17一些随机性。

现在从服务中获取 17 位随机数,并将它们组装成一个二进制数。该数字将在 0 和 2**17-1 (131071) 之间,并且会均匀分布。如果随机数恰好大于 99999,则丢弃您拥有的位并重试。 (需要重试的概率应小于50%。)

最终你会得到一个 0 到 99999 之间的数字,这个算法应该给你一个完全均匀的分布。

关于ruby - 基于 ANU 量子随机数服务器的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28748815/

相关文章:

c++ - 如何在 C++ 中生成由负值和正值组成的范围内的随机数?

ruby - 使用 Apple M1 Homebrew 程序安装 ruby​​-odbc gem 时出现 "ERROR: sql.h not found"

ruby - 如何编写偶数除以最大相等奇数的代码

ruby - 更改 mongoid 关系的名称 (embeds_...,belongs_to,has_...)

ruby - 转义 ruby 字符串

c# - 从字符串列表中选择随机字符串的更好方法

iphone - 随机化对象位置

javascript - 不重复前一个数字的数学随机数

ruby-on-rails - 如何在 Capistrano 3 中设置环境变量?

java - 使用数组查找 2 个列表之间的最大数字