共计 5826 个字符,预计需要花费 15 分钟才能阅读完成。
作者:1. 丘秉宜,2. 邵伟,3. 黄文,4. 郭梦杰
1. 亚马逊云科技 HERO;2. 开发者生态负责人;3.DEVOPS 工程师;4. 资深研发工程师
1、概述
随机性(Randomness)是必然性的一种模式,具备某一概率的事件汇合中的各个事件所体现进去的不确定性。对于一个随机事件能够探讨其可能呈现的概率,反映该事件产生的可能性的大小。随机性在自然科学和哲学上有着重要的位置,也吸引大量的学者在这方面的钻研,随机性在理论利用中也是一种极其重要的资源,以后在许多的畛域中施展着重要的作用,例如博弈,统计抽样,计算机模仿,密码学等。
那么,什么是随机数呢?艰深地讲,随机数序列是对一个均匀分布随机变量的一组抽样,其后果是不可预测的, 序列中的每个数都是独立的,且遵从均匀分布的。随机数通常是由随机数发生器(Random Number Generator 简称 RNG)来产生的。随机数生成是通过随机数生成器(RNG)生成一系列数字或者符号的过程,这些数字和符号无奈比随机机会获更好正当预测。这意味着,特定的后果序列将蕴含一些预先可察觉但无奈预感的模式。
2、真随机数和伪随机数
在计算中,硬件随机数生成器(HRNG)或真随机数生成器是一种从物理过程而不是通过算法生成随机数的设施。这种安装通常基于宏观景象,这些宏观景象产生低水平的、统计上随机的“噪声”信号,如热噪声、光电效应(波及分束器)和其余量子景象。实践上,这些随机过程是齐全不可预测的,只有管制这种景象的方程是未知的或不可计算的。这与通常在计算机程序中实现的伪随机数生成的范例造成比照。
伪随机数生成器(PRNG),也称为确定性随机位生成器(DRBG),是一种用于生成其属性近似于随机数序列属性的数字序列的算法。PRNG 生成的序列不是真正随机的,因为它齐全由称为 PRNG 的种子(可能包含真正随机的值)的初始值确定。尽管能够应用硬件随机数生成器生成更靠近实在随机的序列,但伪随机数生成器在理论中对其生成数字的速度和再现性十分重要。随机数发生器在模仿(例如,蒙特卡洛办法)、电子游戏(例如,程序生成)和密码学等利用中至关重要。明码利用要求输入不能从晚期输入中预测,须要更简单的算法,这些算法不继承简略 PRNG 的线性。
如何能力生成随机数?生成随机数有两种次要办法:
- 第一种办法测量一些预期随机的物理现象,而后弥补测量过程中可能的偏差。示例源包含测量大气噪声、热噪声和其余内部电磁和量子景象。例如,在短时间尺度上测量的宇宙背景辐射或放射性衰变代表了天然熵的起源。从天然起源取得熵的速度取决于所测量的根本物理现象。因而,天然产生的“实在”熵的起源被称为是阻塞的——在取得足够的熵以满足需要之前,它们是速率受限的。在一些类 Unix 零碎(包含大多数 Linux 发行版)上,伪设施文件 /dev/random 将被阻止,直到从环境中取得足够的熵。因为这种阻止行为,在应用这种类型的熵源的零碎上,从 /dev/random 进行大容量读取(例如用随机位填充硬盘驱动器)通常会很慢。
- 第二种办法应用计算算法,能够产生长序列的显著随机后果,这些后果实际上齐全由一个较短的初始值(称为种子值或密钥)决定。后果,如果种子值已知,则能够再现整个看似随机的序列。这种类型的随机数生成器通常被称为伪随机数生成器。这种类型的生成器通常不依赖于天然产生的熵源,只管它能够由天然源周期性地收获。这种生成器类型是非阻塞的,因而它们不受内部事件的速率限度,因而能够进行大容量读取。
还有一些零碎采纳真随机和伪随机混合的办法,在可用时提供从天然起源获取的随机性,并返回到基于加密平安伪随机数生成器(CSPRNG)的定期从新收获软件。当冀望的随机读取速率超过天然播种办法跟上需要的能力时,会产生回退。该办法防止了基于较慢和纯环境办法的随机数生成器的速率受限阻塞行为。尽管仅基于确定性逻辑的伪随机数生成器永远不能被视为最纯正意义上的“实在”随机数源,但实际上,它们通常足以满足要求严格的平安要害利用。精心设计和实现的伪随机数生成器能够被认证用于平安要害的加密目标,正如 yarrow 算法和 fortuna 的状况一样。前者是 FreeBSD、AIX、OS X、NetBSD 和其余平台上的 /dev/random 熵源的根底。OpenBSD 应用一种称为 arc4random 的伪随机数算法。
3、量子随机数
当初罕用的依附计算机模仿产生的伪随机数,或者从某些经典物理噪声(如热噪声,电噪声等)中提取随机数,实际上并不是正真正的随机数,因为从实践上讲,经典物理过程在思考到所有变量的状况下是能够被模仿的。那么是否存在真正的随机数呢,随着量子力学的倒退,通过量子零碎产生随机数曾经成为可能。
量子物理过程所产生的随机性是齐全真随机的,比方量子态的坍缩过程。思考处于叠加状态的一个量子比特:$\ket{\psi}= 1/\sqrt{2}(\ket{0}+\ket{1})$。当应用 Z 基对此比特进行操作而后测量该量子比特时, 将以 1 / 2 的概率测得 $\ket{0}$,1/ 2 的概率测得 $\ket{1}$。值得注意的是, 量子态的测量与抛硬币状况不同, 这里呈现的随机性是量子零碎所固有的, 而不是因为对系统的不理解而产生的。也就是说, 用这样的测量形式来观测这样的态 (两者均明确已知),其观测后果就是随机的,这是由量子力学基本原理决定的。使用量子系统的这种内禀随机性产生的随机数就是真随机数。
4、启科 QuSaaS 量子真随机数解决方案
针对利用中须要应用真随机数的场景,启科推出了本人真随机数计划。在介绍启科真随机数解决方案之前,启科旗下的几个软件平台须要先和大家简要介绍一下:
QuSaaS:启科量子的开发者社区平台,提供量子计算 API 调用,量子利用创立及利用部署调用接口。
QuPot:启科量子公有云平台,治理启科的模 拟量子计算、量子计算利用集成与解耦部署,例如 Qubox。
QuTrunK:QuTrunk 是启科量子自主研发的一款收费、开源、跨平台的量子计算编程框架,包含量子编程 API、量子命令转译、量子计算后端接口等。Qutrunk 应用 Python 作为宿主语言,利用 Python 的语法个性实现针对量子程序的 DSL (畛域专用语言),基于量子逻辑门、量子线路等概念提供量子编程所需各类 API。它也能够作为其余下层量子计算的利用的根底。
QuSprout:QuSprout 是启科量子自主研发的一款收费、开源的量子计算模仿后端,用户在 QuTrunk 量子编程框架生成量子线路后, 如果须要更高的运行效率,须要连贯到 QuSprout 计算后端来进行模拟计算。QuSprout 应用 C++ 作为宿主语言,反对多个量子线路的工作治理、MPI 多过程并行计算。
QuBox:预装 QuSprout 的 PKS 体系硬件,以产品状态 为用户提供量子模仿资源 用户应用启科真量子随机数解决方案,有两个应用场景能够采纳:
1)应用启科开源量子编程框架 Qutrunk 开发量子计算程序,采纳自建模仿量子计算资源。即用户洽购 Qubox 部署到本人机房,本地开发间接通过拜访本地机房的 qubox 硬件资源,调用 qusprout 的 API 拜访 QRNG 产生随机数。
2)间接应用启科量子提供的云上资源,用户注册 QuSaaS,依据 QuSaaS 利用部署创立模板要求开发量子利用,注册利用获取 AK,SK,调测中通过 API 网关调用随机数卡的接口,QuSaaS 进行认证受权通过 Qusprout 调用 qubox 随机数卡生成随机数。开发实现后通过 QuSaaS 部署利用到 QuPot,此时利用运行在一个 qutrunk 环境中,掉用随机数过程与本地调用流程统一。逻辑图如下:
5、QuSaaS 真随机数与 Amazon Braket 联合示例
Amazon Braket 是一项齐全托管式量子计算服务,旨在帮忙放慢量子计算的科学研究和软件开发。用户能够通过本地 Jupyter Notebook/IDE 或者 Amazon console 应用 Amazon Braket SDK 开发量子程序,调用亚马逊云科技提供量子硬件或者模仿资源运行量子计算程序。
此前不久咱们针对 Qutrunk,QuSprout 与 Amazon Braket 联合实际上曾经有了一些文章公布,咱们本次在此基础上进一步拓展到其余服务。本文将针对 QuTrunk 联合 Amazon Barket 后端然利用 QuSaaS 的真随机数接入服务来实现一个小的演示示例。上面咱们将散布进行阐明。
如果须要应用 QuSaaS 真随机数须要依照如下流程操作:
5.1 QuSaaS 真随机数获取操作步骤
1、注册 QuSaaS
登录 QuSasS 网站:http://developer.queco.cn/ 点击右上角注册按钮,实现注册
2、通过 QuSaaS 下载核心下载 QuBranch 和 QuTrunk,并实现本地开发环境部署。具体的装置及部署材质领导请参考 QuSaaS 上的学习文档:http://developer.queco.cn/lea…
3、点击 API 商城洽购 Qutrunk 云接口,新注册用户提供肯定配额的收费额度。
4、点击右上角集体用户名,抉择我的利用,关上利用注册页面。
而后点击创立利用,实现利用创立,并能够获取到 API 的 AK 和 SK 信息。
5、应用 QuTrunk 开发程序调用随机数
1)首先导入 qutrunk 应用的后端模块,应用 QuSaaS 作为后端。
2)从 QuSaaS 上获取的 AK 和 SK 信息,指定调用的 ak 和 sk 参数的值
3)调用 QuSaaS 后端获取真随机数
4)打印获取的随机数的值
代码如下:
from qutrunk.backends import BackendQuSaas, BackendQuSprout
ak = "BNwHKbBIkVT8DSfDlWnZl4rosB7Ie7hhvDvRehyz"
sk = "V2ZfqQJPiaCQhrzAeIIZjNilBrTdqQEujkqXrUP3MtYt1vPCbBo47e8gwRjJcJlaXNJSParPOudhaX8WesvfXSAeb1yYfvC6gbElHoNoH7ali4jLvuxI87v3NCjPMCmu"
# use BackendQuSaas
be = BackendQuSaas(ak, sk)
# generate random number
rands = be.get_rand(20, 2)
print(rands)
打印后果如下:
[b"V\xf1\xcf\x1c\xd2p?\xa3Z`d\xdc'6\x8c2\xbfj\xee\x90", b"su\x073'&\xce\xfe\xfbF%\xf3\xb3\x93\x13\xc5\x83\x8a\xa3s"]
5.2 Amazon Braket 应用 QuSaaS 真随机数
咱们展现一个应用 Amazon Braket 后端运行贝尔电路的例子。应用模仿量子计算的时候须要用到随机数,咱们这里通过 QuSaaS 获取的真随机数作为随机数种子来产生随机数,以运行贝尔电路。
1、首先筹备环境,导入须要用到的模块
import numpy as np
from qutrunk.backends import BackendQuSaas
from qutrunk.backends.braket import BackendAWSLocal
from qutrunk.circuit import QCircuit
from qutrunk.circuit.gates import H, CNOT, All, Measure
2、调用 SaaS 后端获取真随机数
设置获取真随机数的长度为 4,指定 ak 和 sk 为咱们账号下注册利用的 AK 和 SK,而后指定应用 QuSaaS 后端,通过 get_rand() 函数取得随机数。
BYTE_LEN4INT = 4
ak = "BNwHKbBIkVT8DSfDlWnZl4rosB7Ie7hhvDvRehyz"
sk = "V2ZfqQJPiaCQhrzAeIIZjNilBrTdqQEujkqXrUP3MtYt1vPCbBo47e8gwRjJcJlaXNJSParPOudhaX8WesvfXSAeb1yYfvC6gbElHoNoH7ali4jLvuxI87v3NCjPMCmu"
saas_be = BackendQuSaas(ak, sk)
rand_bytes = saas_be.get_rand(BYTE_LEN4INT, 1)
print(rand_bytes)
输入的随机数:
b'v\x1b\xd6\xaf'
3、随机数转换
咱们生成的随机数默认是 16 进制数,须要转换成 10 进制整数。
rand_int = int.from_bytes(rand_bytes[0], byteorder='big')
print(rand_int)
1981535919
4、亚马逊云科技后端应用真随机数,运行贝尔电路
亚马逊云科技本地模仿是应用 numpy 实现,咱们将生成的随机数用于亚马逊云科技本地后端的模仿,应用真随机数作为 numpy 随机数生成的种子。而后通过亚马逊云科技后端运行贝尔电路。
np.random.seed(rand_int)
qc = QCircuit(backend=BackendAWSLocal())
qr = qc.allocate(2)
# Apply quantum gate
H * qr[0]
CNOT * (qr[0], qr[1])
# Measure all quantum qubits
All(Measure) * qr
# Print quantum circuit as operqasm grammar
qc.print(format="openqasm")
# Run quantum circuit
res = qc.run(1024)
print(res.get_counts())
运行后果如下:OPENQASM 2.0;
include "qulib1.inc";
qreg q[2];
creg c[2];
h q[0];
cx q[0],q[1];
measure q[0] -> c[0];
measure q[1] -> c[1];
[{"00": 493}, {"11": 531}]
作者:
Keith Yan(丘秉宜)中国首位亚马逊云科技 Community Hero。
Bertran Shao(邵伟),启科量子开发者关系负责人,国内首个开源量子计算社区发起者。
黄文,启科量子 DEVOPS 工程师
Marz Kuo(郭梦杰),启科量子资深研发工程师,量子计算开源框架保护人
浏览原文:https://dev.amazoncloud.cn/co…