生成随机数解析

在实际应用中有很多需要生成随机数。关于随机数生成器,有两个相关的函数。一个是 rand(),该函数只返回一个伪随机数。生成随机数之前必须先调用 srand() 函数。

其中,srand函数是随机数发生器的初始化函数:
原型: void srand(unsigned seed);
用法:它需要提供一个种子,这个种子会对应一个随机数,如果使用相同的种子后面的rand()函数会出现一样的随机数。
如: srand(1); 直接使用 1 来初始化种子。
不过为了防止随机数每次重复,常常使用系统时间来初始化,即使用 time 函数来获得系统时间,它的返回值为从 00:00:00 GMT, January 1, 1970 到现在所持续的秒数,然后将 time_t 型数据转化为(unsigned)型再传给 srand 函数,即: srand((unsigned) time(&t));
还有一个经常用法,不需要定义time_t型t变量,即: srand((unsigned) time(NULL)); 直接传入一个空指针,因为你的程序中往往并不需要经过参数获得的t数据。
举例:

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <time.h> /*用到了time函数,所以要有这个头文件*/
#define MAX 10
using namespace std;
int main( void)
{
   
    int number[MAX] = {
   0};
    int i;
    srand((unsigned) time(NULL)); /*播种子*/
    for(i = 0; i < MAX; i++)
    {
   
        number[i] = rand() % 100; /*产生100以内的随机整数*/
		cout << number[i] << endl;
		//cout << rand()%100/(double)101 << endl; //生成0-1间的随机数
    }
    return 0;
}

运行结果:

79  5  25  28  21  47  84  97  70  72  
0.188119  0.891089  0.712871  0.841584  0.861386  0.554455  0.475248  0.633663  0.782178  0.554455
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
舍选法生成随机数是一种简单的方法,它通过生成一对坐标 $(x,y)$,在单位正方形内进行随机点的坐标 $(x,y)$,然后根据点是否落在所需分布的函数曲线上,来判断随机数是否符合要求。这种方法的简单易懂,但是效率较低。 逆变换法生成随机数是一种较为常用的生成随机数的方法,它利用随机变量的分布函数的反函数来实现。具体来说,首先我们需要得到所需分布的累积分布函数(CDF),然后求出其反函数(即分布函数的逆函数),最后利用逆函数将 $[0,1]$ 区间内的随机数转化为符合所需分布的随机数。这种方法简单高效,但是对于某些难以求得分布函数的分布,可能不太适用。 复合法生成随机数是一种结合了舍选法和逆变换法的方法,它利用逆变换法生成一些较为容易生成的随机数,然后通过复合的方式将这些随机数转化为所需分布的随机数。这种方法相对于舍选法和逆变换法来说,更加高效且灵活。 条件分布法生成随机数是一种利用条件概率密度函数的方法,它先确定一些随机变量的取值,然后在这些取值的条件下,生成符合条件概率密度函数的随机数。这种方法比较适用于多维随机变量的生成。 稀松法模拟泊松分布生成随机数是一种针对泊松分布的生成方法,它通过将时间分成很多个小区间,在每个小区间内进行随机事件的发生与否的判断,从而实现泊松分布的生成。 下面我们通过例题来具体分步骤讲解这些方法: 例题:假设我们需要生成符合正态分布 $N(0,1)$ 的随机数。 1. 舍选法生成随机数 首先,我们需要将正态分布的概率密度函数 $f(x)$ 转化为概率函数 $F(x)$,即正态分布的累积分布函数(CDF)。正态分布的概率密度函数为: $$f(x) = \frac{1}{\sqrt{2\pi}}e^{-\frac{x^2}{2}}$$ 其累积分布函数(CDF)为: $$F(x) = \int_{-\infty}^{x} \frac{1}{\sqrt{2\pi}}e^{-\frac{t^2}{2}} dt$$ 由于正态分布函数没有解析解,我们无法求出其逆函数,因此舍选法生成正态分布的随机数不太可行。 2. 逆变换法生成随机数 同样地,我们需要将正态分布的概率密度函数 $f(x)$ 转化为概率函数 $F(x)$,即正态分布的累积分布函数(CDF)。正态分布的概率密度函数为: $$f(x) = \frac{1}{\sqrt{2\pi}}e^{-\frac{x^2}{2}}$$ 其累积分布函数(CDF)为: $$F(x) = \int_{-\infty}^{x} \frac{1}{\sqrt{2\pi}}e^{-\frac{t^2}{2}} dt$$ 我们可以利用高斯分布的性质,将标准正态分布 $N(0,1)$ 转化为 $N(\mu,\sigma^2)$,即: $$X = \mu + \sigma Z$$ 其中 $Z$ 为标准正态分布的随机变量,$\mu$ 和 $\sigma$ 分别为期望和标准差。 我们可以利用 $Z$ 的累积分布函数(CDF) $F_Z(z)$,求出其逆函数 $F_Z^{-1}(u)$,然后将 $[0,1]$ 区间内的随机数 $u$ 代入 $F_Z^{-1}(u)$,得到符合标准正态分布 $N(0,1)$ 的随机数 $Z$。最后,我们将 $Z$ 转化为符合正态分布 $N(\mu,\sigma^2)$ 的随机数 $X$,即: $$X = \mu + \sigma Z$$ 这样我们就得到了符合正态分布 $N(0,1)$ 的随机数。 3. 复合法生成随机数 在上面的逆变换法中,我们利用标准正态分布的随机变量 $Z$,通过逆变换法生成符合 $N(0,1)$ 的随机数。因此,如果我们需要生成符合 $N(\mu,\sigma^2)$ 的随机数,只需要将其转化为 $N(0,1)$ 即可。具体来说,我们可以利用以下公式: $$X = \mu + \sigma Z$$ 其中 $Z$ 为标准正态分布的随机变量,$\mu$ 和 $\sigma$ 分别为期望和标准差。这样我们就得到了符合正态分布 $N(\mu,\sigma^2)$ 的随机数。 4. 条件分布法生成随机数 条件分布法生成随机数需要确定一些随机变量的取值,然后在这些取值的条件下,生成符合条件概率密度函数的随机数。以正态分布 $N(\mu,\sigma^2)$ 为例,我们可以先生成一个随机变量 $Z$,使其符合标准正态分布 $N(0,1)$。然后,我们通过以下公式,将 $Z$ 转化为符合 $N(\mu,\sigma^2)$ 的随机数: $$X = \mu + \sigma Z$$ 这样我们就得到了符合正态分布 $N(\mu,\sigma^2)$ 的随机数。 5. 稀松法模拟泊松分布生成随机数 稀松法模拟泊松分布生成随机数是一种针对泊松分布的生成方法,它通过将时间分成很多个小区间,在每个小区间内进行随机事件的发生与否的判断,从而实现泊松分布的生成。 以泊松分布 $P(\lambda)$ 为例,我们可以将时间分成很多个小区间,每个小区间的长度为 $\Delta t$。在每个小区间内,我们按照泊松分布的概率密度函数 $f(t) = \frac{\lambda^t}{t!}e^{-\lambda}$,生成一个随机数 $r$,如果 $r \leq f(t)$,则表示在这个小区间内事件发生了。我们将所有发生事件的小区间内的事件个数加起来,就得到了符合泊松分布 $P(\lambda)$ 的随机数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值