伪随机数

Wolfram 语言具有三个函数,用以产生在一个值域上均匀分布的伪随机数.

RandomInteger[]具有概率为 的0或1
RandomInteger[{imin,imax}]包含在 内的伪随机整数
RandomInteger[imax]包含在 0 和 内的伪随机整数
RandomReal[ ]0 和 1 之间的伪随机实数
RandomReal[{x_(min), x_(max)}] 之间的伪随机实数
RandomReal[x_(max)]0 和 之间的伪随机实数
RandomComplex[]单位方域中的伪随机复数
RandomComplex[{zmin,zmax}] 定义的长方形中的伪随机复数
RandomComplex[z_(max)]由 0 和 定义的长方形中的伪随机复数

伪随机数的生成.

RandomReal[range,n], RandomComplex[range,n], RandomInteger[range,n]
从给定区域得到的 n 个伪随机数的列表
RandomReal[range,{n1,n2,}], RandomComplex[range,{n1,n2,}], RandomInteger[range,{n1,n2,}]
由伪随机数组成的 ×× 数组

伪随机数表的生成.

这里给出具有相同概率的 0 或者 1.
In[1]:=
Click for copyable input
Out[1]=
这里生成伪随机复数.
In[2]:=
Click for copyable input
Out[2]=
这里给出包含在 0 和 9 中的十个伪随机整数的列表.
In[3]:=
Click for copyable input
Out[3]=
这里给出在 0 和 1 之间的伪随机实数的矩阵.
In[4]:=
Click for copyable input
Out[4]=

RandomRealRandomComplex 使得用户可以获得具有任意精度的伪随机数.

选项名
默认值
WorkingPrecisionMachinePrecision用于实数或者复数的精度

改变伪随机数的精度.

这是0与1之间的30位的伪随机实数.
In[5]:=
Click for copyable input
Out[5]=
以下是4个20位伪随机复数的列表.
In[6]:=
Click for copyable input
Out[6]=

如果反复获取伪随机数数组,将得到一个典型数列,它们没有特定的类型. 有许多使用这些数的方法.

使用伪随机数的一个常见方法是进行数值假设检验. 例如,如果用户相信两个符号表达式在数学上是相等的. 可以通过给符号参数插上典型数值的值. 然后比较数值结果来进行检验. (如果要这样做的话,在数值准确度问题上,在可能没有唯一值的复变量的函数上,都应当仔细小心).

这是一个符号方程.
In[7]:=
Click for copyable input
Out[7]=
用随机数字代入表明方程不总是为真 True.
In[8]:=
Click for copyable input
Out[8]=

伪随机数的其它常见用法包括模拟随机过程,概率空间的采样. Wolfram 语言生成的伪随机数总是在指定范围上的均匀分布.

RandomIntegerRandomRealRandomComplex 与其它的 Wolfram 语言函数不同,每次调用它时,都将得到不同的结果. 因此,如果在计算中使用它们,在不同的时机会得到不同的答案.

RandomIntegerRandomRealRandomComplex 得到的序列在多数意义下并不是真正随机的,尽管实际上它们应当是足够随机的. 事实上,这个序列是通过使用从一个特定起点开始的确定数学算法生成的. 如果给出相同的起点,将得到相同的序列.

当 Wolfram 语言启动时,它取时钟时刻(用一秒的一小部分度量)作为伪随机生成器的起点. 因此,两个不同的Wolfram 语言进程几乎总是给出不同的伪随机序列.

如果用户想要确定总是得到相同的伪随机数序列,可以使用 SeedRandom 明显地给伪随机数生成一个起点.

SeedRandom[]使用时钟时刻重设伪随机生成器的起点
SeedRandom[s]使用整数 s 重设伪随机生成器的起点

伪随机数生成器的起点.

重设伪随机数生成器的起点.
In[9]:=
Click for copyable input
这是三个伪随机数.
In[10]:=
Click for copyable input
Out[10]=
如果重设伪随机数生成器的起点与上例相同,则会得到相同的伪随机数序列.
In[11]:=
Click for copyable input
Out[11]=

每调用一次 RandomIntegerRandomReal 或者 RandomComplex,伪随机数生成器的内部状态就被改变,这意味着在辅助运算中调用这些函数,将会影响主运算中返回的数. 要避免这个问题,可以在运算 BlockRandom 中局部化这些函数的使用效果.

BlockRandom[expr]使用局部化的伪随机生成器的当前状态计算 expr

使用 RandomIntegerRandomReal 或者 RandomComplex 局部化效果.

通过在 BlockRandom 中进行局部化计算,在生成第一个列表之后,伪随机数生成器的状态被恢复.
In[12]:=
Click for copyable input
Out[12]=

许多应用需要从非均匀分布得到的随机数. Wolfram 语言具有许多系统内置的分布. 用户可以使用合适的参数给出分布,其范围在 RandomInteger 或者 RandomReal 中.

RandomInteger[dist], RandomReal[dist]
服从随机分布 dist 的伪随机数
RandomInteger[dist,n], RandomReal[dist,n]
服从随机分布 distn 个伪随机数的列表
RandomInteger[dist,{n1,n2,}], RandomReal[dist,{n1,n2,}]
由服从随机分布 dist 的伪随机数组成的 ×× 数组

使用非均匀分布生成伪随机数.

这里生成均值为3的服从泊松分布的12个整数.
In[13]:=
Click for copyable input
Out[13]=
这里使用标准正态分布生成由实数组成的 4×4 矩阵.
In[14]:=
Click for copyable input
Out[14]=
这里生成服从均值为2、标准差为4的正态分布的5个高精度实数.
In[15]:=
Click for copyable input
Out[15]=

伪随机数的另一个使用是从列表中进行选择. RandomChoice 使用可重置的选择,而 RandomSample 使用不可重置的采样.

RandomChoice[list, n]list 随机选择 n 个项
RandomChoice[list,{n1,n2,}]list 随机选择得到的值组成的 ×× 数组
RandomSample[list, n]list 得到的大小为 n 的样本

随机选择.

从数字0到9内随机选择10个项.
In[16]:=
Click for copyable input
Out[16]=

至少一个选择在输出中重复出现的机会非常大. 这是因为当一个元素被选出后,它立即被重新放回原处. 另一方面,如果用户想要从一个实际的元素集合中进行选择的话,就不应该可以重置.

使用不可重置的规则从数字0到9中随机采样10个项. 所得结果是数字的随机排列.
In[17]:=
Click for copyable input
Out[17]=
从一个集合中采集10个项对于每个数字来说有不同的频率.
In[18]:=
Click for copyable input
Out[18]=