伪随机数
Mathematica 具有三个函数,用以产生在一个值域上均匀分布的伪随机数.
伪随机数的生成.
| RandomReal[range,n], RandomComplex[range,n], RandomInteger[range,n] |
| 从给定区域得到的 n 个伪随机数的列表 |
| RandomReal[range,{n1,n2,...}], RandomComplex[range,{n1,n2,...}], RandomInteger[range,{n1,n2,...}] |
| 由伪随机数组成的 × ×... 数组 |
伪随机数表的生成.
| Out[1]= |  |
| Out[2]= |  |
这里给出包含在 0 和 9 中的十个伪随机整数的列表.
| Out[3]= |  |
| Out[4]= |  |
RandomReal 和 RandomComplex 使得用户可以获得具有任意精度的伪随机数.
改变伪随机数的精度.
| Out[5]= |  |
| Out[6]= |  |
如果反复获取伪随机数数组,将得到一个"典型"数列,它们没有特定的类型. 有许多使用这些数的方法.
使用伪随机数的一个常见方法是进行数值假设检验. 例如,如果用户相信两个符号表达式在数学上是相等的. 可以通过给符号参数插上"典型"数值的值. 然后比较数值结果来进行检验. (如果要这样做的话,在数值准确度问题上,在可能没有唯一值的复变量的函数上,都应当仔细小心).
| Out[7]= |  |
| Out[8]= |  |
伪随机数的其它常见用法包括模拟随机过程,概率空间的采样. Mathematica 生成的伪随机数总是在指定范围上的均匀分布.
RandomInteger、RandomReal 和 RandomComplex 与其它的 Mathematica 函数不同,每次调用它时,都将得到不同的结果. 因此,如果在计算中使用它们,在不同的时机会得到不同的答案.
由 RandomInteger、RandomReal 和 RandomComplex 得到的序列在多数意义下并不是"真正随机的",尽管实际上它们应当是"足够随机的". 事实上,这个序列是通过使用从一个特定起点开始的确定数学算法生成的. 如果给出相同的起点,将得到相同的序列.
当 Mathematica 启动时,它取时钟时刻(用一秒的一小部分度量)作为伪随机生成器的起点. 因此,两个不同的Mathematica 进程几乎总是给出不同的伪随机序列.
如果用户想要确定总是得到相同的伪随机数序列,可以使用 SeedRandom 明显地给伪随机数生成一个起点.
伪随机数生成器的起点.
| Out[10]= |  |
如果重设伪随机数生成器的起点与上例相同,则会得到相同的伪随机数序列.
| Out[11]= |  |
每调用一次 RandomInteger、RandomReal 或者 RandomComplex,伪随机数生成器的内部状态就被改变,这意味着在辅助运算中调用这些函数,将会影响主运算中返回的数. 要避免这个问题,可以在运算 BlockRandom 中局部化这些函数的使用效果.
使用 RandomInteger、RandomReal 或者 RandomComplex 局部化效果.
| Out[12]= |  |
许多应用需要从非均匀分布得到的随机数. Mathematica 具有许多系统内置的分布. 用户可以使用合适的参数给出分布,其范围在 RandomInteger 或者 RandomReal 中.
| RandomInteger[dist], RandomReal[dist] |
| 服从随机分布 dist 的伪随机数 |
| RandomInteger[dist,n], RandomReal[dist,n] |
| 服从随机分布 dist 的 n 个伪随机数的列表 |
| RandomInteger[dist,{n1,n2,...}], RandomReal[dist,{n1,n2,...}] |
| 由服从随机分布 dist 的伪随机数组成的 × ×... 数组 |
使用非均匀分布生成伪随机数.
| Out[13]= |  |
这里使用标准正态分布生成由实数组成的 4×4 矩阵.
| Out[14]= |  |
这里生成服从均值为2、标准差为4的正态分布的5个高精度实数.
| Out[15]= |  |
伪随机数的另一个使用是从列表中进行选择. RandomChoice 使用可重置的选择,而 RandomSample 使用不可重置的采样.
随机选择.
| Out[16]= |  |
至少一个选择在输出中重复出现的机会非常大. 这是因为当一个元素被选出后,它立即被重新放回原处. 另一方面,如果用户想要从一个实际的元素集合中进行选择的话,就不应该可以重置.
使用不可重置的规则从数字0到9中随机采样10个项. 所得结果是数字的随机排列.
| Out[17]= |  |
从一个集合中采集10个项对于每个数字来说有不同的频率.
| Out[18]= |  |