Matlab软件内置了五种用于生成随机数的函数,以支持不同的随机数需求:
rand函数:该函数专门用于生成在(0, 1)区间内均匀分布的随机数,广泛适用于需要基础随机数生成的场景。randn函数:主要用于生成均值为0,方差为1的标准正态分布随机数,适用于统计分析等领域。randi函数:此函数能够生成[1, imax]范围内均匀分布的伪随机整数,常用于需要随机整数的算法设计中。randsrc函数:这是一个较为特殊的函数,可以生成一个m-by-n的矩阵,矩阵中的元素从指定的alphabet集合中抽取,每个元素被抽中的概率由prob参数精确控制。randperm函数:用于生成一个1到n的随机排列序列,常用于需要随机排列数据的场景。相比之下,在C++编程语言中,生成随机数通常需要借助rand()和srand()这两个核心函数。
对于C++ 11标准之前的版本,随机数生成主要依赖于rand/srand这两个函数即可满足需求。而C++11标准引入了更为丰富的随机数生成库,提供了更多的灵活性和选择,但由于篇幅限制,这里不进行详细展开。
rand()函数的核心功能是返回一个介于0到RAND_MAX之间的整数,其中RAND_MAX是一个在<cstdlib>头文件中定义的常数。
需要特别指出的是,rand()函数返回的数值实际上是通过特定的算法计算得到的,并非真正意义上的随机数。其生成过程依赖于一个种子值,不同的种子值会产生不同的随机数序列。系统默认的种子值是1,这意味着如果每次运行程序时都使用相同的种子值,那么生成的随机数序列将是完全相同的。
例如,下面这段代码展示了rand()函数的使用方法:
运行结果如下图所示,从结果中可以明显看出,每次运行程序时变量x的值都是固定的。
为了使每次运行程序时变量x的值都不同,必须确保其种子值是随机的。这时就需要使用srand()函数来设置rand()函数的种子值。srand()函数可以根据不同的输入参数生成不同的种子值,通常情况下,我们会使用time()函数作为srand()函数的输入参数。
time()函数会返回自1970年1月1日至今所经历的时间(以秒为单位)。
在使用rand()函数之前,必须先调用srand()函数来设置种子值,并且在整个程序中只需要调用一次srand()函数。以下是相应的代码示例:
运行结果如下:
需要注意的是:time()函数返回的值是自1970年1月1日至今所经历的时间(以秒为单位),如果你能够足够快速地执行多次程序,即time()函数返回的值相同,那么x的值也会相同。
在实际应用中,通常需要将随机数的范围限制在1到某个值max之间,这时可以使用以下公式来实现:
求余数运算符(%)用于获取整除之后的余数。例如,当max为6时,余数将是0〜5,给余数加1即可转换为1~6的范围。
运行结果如下:
PS:计算机本质上是一个可预测的系统,因此不可能通过算法生成真正的随机数。在计算机中,所谓的随机数实际上都是伪随机数,即通过随机算法计算出来的,可以被近似看作随机数的数值。
常见的随机数算法包括线性同余法(Linear Congruential Generator)和梅森旋转法(Mersenne twister)等。