概述 随机性(Randomness)是偶然性的一种形式,具有某一概率的事件集合中的各个事件所表现出来的不确定性。对于一个随机事件可以探讨其可能出现的概率,反映该事件发生的可能性的大小。随机性在自然科学和哲学上有着重要的地位,也吸引大量的学者在这方面的研究,随机性在实际应用中也是一种极其重要的资源,当前在许多的领域中发挥着重要的作用,例如博弈,统计抽样,计算机模拟,密码学等。随机数的概念也由随机性而诞生。 1. 随机数 1.1 随机数介绍 随机数是指在一定范围内,按照一定的概率分布规律产生的数值,是统计学和计算机科学中的重要概念。在计算机程序中,随机数通常是由伪随机数生成器生成的,即根据某个初始种子值,采用一定的算法生成的序列。随机数序列具有不可预测性和不可重复性,能够在模拟实验、密码学、游戏、抽样调查等领域得到广泛应用。 具备实用价值的随机数,首先要满足一定的随机特性:在任意给定范围内,由独立数字在给定的概率分布中抽样构成的序列;随机序列中的数字互相没有关联,获知序列中的一个或多个数字,并不能由此预测序列中的其它数字;具有与随机位相同的统计特性,不可预测、不能再现。其次该随机数应当在有限的长度中实现这些随机特性,以符合其在信息设备中的实用目标。 随机数还有很多衍生概念,例如均匀分布、正态分布、随机过程等。这些概念在统计学、概率论、信息论等领域都有重要应用,是理解和应用这些学科的基础。 1.2 真随机数和伪随机数 在计算中,硬件随机数生成器(HRNG)或真随机数生成器是一种从物理过程而不是通过算法生成随机数的设备。这种装置通常基于微观现象,这些微观现象产生低水平的、统计上随机的“噪声”信号,如热噪声、光电效应(涉及分束器)和其他量子现象。理论上,这些随机过程是完全不可预测的,只要控制这种现象的方程是未知的或不可计算的。这与通常在计算机程序中实现的伪随机数生成的范例形成对比。 伪随机数生成器(PRNG),也称为确定性随机位生成器(DRBG),是一种用于生成其属性近似于随机数序列属性的数字序列的算法。PRNG生成的序列不是真正随机的,因为它完全由称为PRNG的种子(可能包括真正随机的值)的初始值确定。虽然可以使用硬件随机数生成器生成更接近真实随机的序列,但伪随机数生成器在实际中对其生成数字的速度和再现性非常重要。随机数发生器在模拟(例如,蒙特卡洛方法)、电子游戏(例如,程序生成)和密码学等应用中至关重要。密码应用要求输出不能从早期输出中预测,需要更复杂的算法,这些算法不继承简单PRNG的线性。 如何才能生成随机数?生成随机数有两种主要方法: 1. 第一种方法,测量一些预期随机的物理现象,然后补偿测量过程中可能的偏差。示例源包括测量大气噪声、热噪声和其他外部电磁和量子现象。例如,在短时间尺度上测量的宇宙背景辐射或放射性衰变代表了自然熵的来源。从自然来源获得熵的速度取决于所测量的基本物理现象。因此,自然产生的“真实”熵的来源被称为是阻塞的——在获得足够的熵以满足需求之前,它们是速率受限的。在一些类Unix系统(包括大多数Linux发行版)上,伪设备文件/dev/random将被阻止,直到从环境中获得足够的熵。由于这种阻止行为,在使用这种类型的熵源的系统上,从/dev/random进行大容量读取(例如用随机位填充硬盘驱动器)通常会很慢。 2. 第二种方法,使用计算算法,可以产生长序列的明显随机结果,这些结果实际上完全由一个较短的初始值(称为种子值或密钥)决定。结果,如果种子值已知,则可以再现整个看似随机的序列。这种类型的随机数生成器通常被称为伪随机数生成器。这种类型的生成器通常不依赖于自然产生的熵源,尽管它可以由自然源周期性地播种。这种生成器类型是非阻塞的,因此它们不受外部事件的速率限制,因此可以进行大容量读取。 还有一些系统采用真随机和伪随机混合的方法,在可用时提供从自然来源获取的随机性,并返回到基于加密安全伪随机数生成器(CSPRNG)的定期重新播种软件。当期望的随机读取速率超过自然收获方法跟上需求的能力时,会发生回退。该方法避免了基于较慢和纯环境方法的随机数生成器的速率受限阻塞行为。 虽然仅基于确定性逻辑的伪随机数生成器永远不能被视为最纯粹意义上的“真实”随机数源,但实际上,它们通常足以满足要求严格的安全关键应用。精心设计和实现的伪随机数生成器可以被认证用于安全关键的加密目的,正如yarrow算法和fortuna的情况一样。前者是FreeBSD、AIX、OS X、NetBSD和其他平台上的/dev/random熵源的基础。OpenBSD使用一种称为arc4random的伪随机数算法。 1.3 量子随机数 经典随机现象都是可以准确预测的。例如,如果你用一台摄像机精确拍下你刚刚掷出骰子时,骰子的位置、速度和角速度,那么从理论上讲,计算机就可以在骰子落下之前,计算出它的落点和朝向。这样一来,经典随机就不是完全没可能破解的了。 自从量子力学诞生以后,物理学家就发现,量子力学存在内禀的随机性,很多实验都会产生随机的结果。在量子力学的主流理论中,没有任何人能通过任何办法预测实验产生的随机结果,这就是量子随机。 量子随机数就是指利用量子力学原理生成的随机数。根据量子力学原理,某些量子系统中的测量结果是随机的,这些随机性是不可预测的,因此可以用来产生高度随机的数字序列。这些数字序列可以用于密码学、模拟等领域。 一种常见的量子随机数生成方法是基于量子态的测量。例如,可以使用量子比特的自旋来实现这种随机数生成。在量子比特自旋的测量中,有50%的概率测量结果为0,另外50%的概率测量结果为1,这些结果就可以用来产生随机数。 量子随机数的优点在于其随机性和不可预测性非常高,这使得它在安全通信和密码学应用中具有很大的潜力。 1.4 量子随机数的应用场景 目前,启科量子已能通过软件端的量子模拟计算来实现随机数的生成,具体代码示例如下: 步骤1 环境准备 from qutrunk.circuit import QCircuit from qutrunk.circuit.gates import H, Measure, All 步骤2 运行随机数比特,并归集信息
步骤3 打印电路和输出信息结果 qc.print() res = qc.run() print(res.get_measure()) 步骤4 输出结果生成量子随机数共[1, 0, 1, 0, 1, 0, 1, 0]。
当然,在一些特定的应用场景中,需要生成高质量的随机数,以确保数据的安全性和可靠性。上面的代码所展示的生成简单随机数的方法也就不适用了。 当我们需要高质量的随机数时,可通过量子随机数生成器来生成高质量的随机数。并且这些随机数可以通过特定的协议进行验证,以保证其真正的随机性。这种随机数在密码学、模拟等领域都有着广泛的应用。其中最广泛地应用无疑是在金融领域: 以下是一个使用Python编写的量子随机数生成器示例代码,该代码使用启科量子的量子计算机套件QuSprout作为模拟后端。 # 导入所需的库 from qutrunk.circuit import QCircuit from qutrunk.circuit.gates import H, Measure, All
# 创建一个量子随机数生成器电路 def generate_random_number_circuit(bits): circuit = QuantumCircuit(bits, bits) for i in range(bits): circuit.h(i) circuit.measure(range(bits), range(bits)) return circuit
# 运行量子随机数生成器并返回一个整数 def generate_random_number(): bits = 10 # 设置要生成的随机数的位数 circuit = generate_random_number_circuit(bits) backend = Aer.get_backend('qasm_simulator') job = execute(circuit, backend, shots=1) result = job.result().get_counts() binary = list(result.keys())[0] decimal = int(binary, 2) return decimal
# 生成一个随机数并打印它 random_number = generate_random_number() print('生成的随机数是:', random_number) 这段代码能够生成一个10位的随机数,我们还可以根据需要更改位数。同时我们能够看出该代码返回的是一个整数,不过根据实际需要,我们也可以将其转换为浮点数或其他数据类型。此代码生成的这个高质量随机数可以在金融领域用作加密密钥,保证数据安全。 2. 真量子随机数解决方案 目前,针对应用中需要使用真随机数的场景,启科量子推出了自己真随机数方案。用户在使用启科真量子随机数解决方案时,有两个使用场景可以采用: 1)使用启科开源量子编程框架Qutrunk开发量子计算程序,采用自建模拟量子计算资源。即用户采购Qubox部署到自己机房,本地开发直接通过访问本地机房的qubox硬件资源,调用qusprout的API访问QRNG产生随机数。 2)直接使用启科量子提供的云上资源,用户注册QuSaaS,根据QuSaaS应用部署创建模板要求开发量子应用,注册应用获取AK,SK,调测中通过API网关调用随机数卡的接口,QuSaaS进行认证授权通过Qusprout调用qubox随机数卡生成随机数。开发完成后通过QuSaaS部署应用到QuPot,此时应用运行在一个qutrunk环境中,掉用随机数过程与本地调用流程一致。逻辑图如下: 接下来,我们展示一个使用Amazon Braket后端运行贝尔电路的例子。使用模拟量子计算的时候需要用到随机数,我们这里通过QuSaaS获取的真随机数作为随机数种子来产生随机数,以运行贝尔电路。 1. 首先准备环境,导入需要用到的模块
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进制整数。
4. AWS后端使用真随机数,运行贝尔电路 AWS本地模拟是使用numpy实现,我们将生成的随机数用于aws本地后端的模拟,使用真随机数作为numpy随 机数生成的种子。然后通过AWS后端运行贝尔电路。 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()) 运行结果如下:
3. 总结 在本文中,我们详细介绍了量子随机数的概念及应用,以及如何使用启科量子的量子计算机软件生成真正的随机数。尽管量子随机数生成器在目前仍然处于实验研究阶段,但它们已经开始在一些领域中得到应用。 通过使用量子计算机,我们可以生成不可预测、不可重现和高质量的随机数,这些随机数可以用于加密通信、密码学、金融领域和其他许多应用。我们希望,本文对读者理解量子随机数生成的原理和实现有所帮助,并且对进一步研究量子计算机和量子技术产生兴趣。 |
|