浅析C语言中的伪随机数
1个回答
展开全部
哈喽,大家好,我是北方素素~
首先给大家解释一下这个标题,什么叫做“浅析”呢?就是稍微分析一下,哈哈。用了“浅析”就突然感觉高大上了,其实并没有多深奥,只是以我的理解给大家解释一下。
我们知道,在一些书籍中,使用C语言生成随机数一般是这样写的:
srand(unsigned(time(NULL)));
int rand_number = rand();
这里主要涉及到了三个函数,srand(),rand()和time()。
不知道这三个函数是做什么的?MSDN文档中解释了这三个函数的作用:
srand():Sets the starting seed value for the pseudorandom number generator(设置伪随机数生成器的起始种子值)。
它的搭档rand():Generates a pseudorandom number(生成一个伪随机数)。
而time()的解释就更简单了:Get the system time(获得系统时间)。
这三个函数组合在一起,就可以生成随机数。
细心的同学可能会发现这里有一个特殊的词-伪随机数。那么什么是伪随机数呢?
关于伪随机数的概念我就不多说了,大家自行搜索一下就有很多解释,在这里我只说一下自己的理解:
先说一下真随机,真随机也就是我们日常说的随机,一个随机事件的结果是不确定的,比如抛硬币,在正常情况下,抛硬币的结果是不确定的,换句话说,结果是不可预测的。
然后说说伪随机,伪随机是计算机生成随机数的一种方式,计算机不能真正模仿随机事件,而只能通过计算来生成随机数。换句话说,如果我们知道了计算机计算随机数的算法,我们是可以预测伪随机数的。
当然我们得用例子说话。
从上面的讨论我们可以知道,因为rand()产生的数字是伪随机数,所以它一定有一个固定的算法来生成伪随机数,那么算法是固定的,不固定的只有srand()所设置的种子了。
确定了这一点之后,我们就可以做实验验证我们的猜想了。
如果srand()设定的种子是一个固定值会发生什么?
srand(1);
int rand_number = rand();
在我执行了N次之后,结果都是固定的。(大家可以亲自试一试)
这就说明我们的“随机数”就是通过某种算法计算出来的结果,所以要想这个结果发生变化,就需要设定一个不断变化的“种子”。
那么这里也就解释了“种子”的作用-用来给随机数生成器提供一个输入,之后随机数生成器就会使用这个“种子”生成不同的伪随机数。
举个栗子~
如果我们的随机数生成算法是这样的:
rand=1+x;
那么我们的“种子”就是上式中的x,,每当我们输入不同的x,产生的结果rand也就会不同。
至于为什么选择time()作为“种子”嘛,上面说了,这个函数呢,用来获取系统时间,因为系统时间是一直在变化的,就相当于我们随机数的“种子”是在一直变化的,所以每次调用time()函数,都会获得不同的值,这样我们的rand()每次生成的结果也就不一样啦~
最后总结一下这三个函数在生成伪随机数的时候是怎么配合的。
首先,time()获取了系统时间;然后,srand()把获取到的系统时间设置为rand()的“种子”;最后,由rand()通过计算,把“种子”转换为一个数字。
好啦,这篇文章就写到这里了~
欢迎大家访问我的网站:https://bfss.github.io/,如果觉得我的文章帮到了您,可以在网站上点击“支持我”对我进行鼓励哟~(手机端网页在左上角,电脑端网页在右上角)
https://www.bilibili.com/read/cv311534
出处: bilibili
首先给大家解释一下这个标题,什么叫做“浅析”呢?就是稍微分析一下,哈哈。用了“浅析”就突然感觉高大上了,其实并没有多深奥,只是以我的理解给大家解释一下。
我们知道,在一些书籍中,使用C语言生成随机数一般是这样写的:
srand(unsigned(time(NULL)));
int rand_number = rand();
这里主要涉及到了三个函数,srand(),rand()和time()。
不知道这三个函数是做什么的?MSDN文档中解释了这三个函数的作用:
srand():Sets the starting seed value for the pseudorandom number generator(设置伪随机数生成器的起始种子值)。
它的搭档rand():Generates a pseudorandom number(生成一个伪随机数)。
而time()的解释就更简单了:Get the system time(获得系统时间)。
这三个函数组合在一起,就可以生成随机数。
细心的同学可能会发现这里有一个特殊的词-伪随机数。那么什么是伪随机数呢?
关于伪随机数的概念我就不多说了,大家自行搜索一下就有很多解释,在这里我只说一下自己的理解:
先说一下真随机,真随机也就是我们日常说的随机,一个随机事件的结果是不确定的,比如抛硬币,在正常情况下,抛硬币的结果是不确定的,换句话说,结果是不可预测的。
然后说说伪随机,伪随机是计算机生成随机数的一种方式,计算机不能真正模仿随机事件,而只能通过计算来生成随机数。换句话说,如果我们知道了计算机计算随机数的算法,我们是可以预测伪随机数的。
当然我们得用例子说话。
从上面的讨论我们可以知道,因为rand()产生的数字是伪随机数,所以它一定有一个固定的算法来生成伪随机数,那么算法是固定的,不固定的只有srand()所设置的种子了。
确定了这一点之后,我们就可以做实验验证我们的猜想了。
如果srand()设定的种子是一个固定值会发生什么?
srand(1);
int rand_number = rand();
在我执行了N次之后,结果都是固定的。(大家可以亲自试一试)
这就说明我们的“随机数”就是通过某种算法计算出来的结果,所以要想这个结果发生变化,就需要设定一个不断变化的“种子”。
那么这里也就解释了“种子”的作用-用来给随机数生成器提供一个输入,之后随机数生成器就会使用这个“种子”生成不同的伪随机数。
举个栗子~
如果我们的随机数生成算法是这样的:
rand=1+x;
那么我们的“种子”就是上式中的x,,每当我们输入不同的x,产生的结果rand也就会不同。
至于为什么选择time()作为“种子”嘛,上面说了,这个函数呢,用来获取系统时间,因为系统时间是一直在变化的,就相当于我们随机数的“种子”是在一直变化的,所以每次调用time()函数,都会获得不同的值,这样我们的rand()每次生成的结果也就不一样啦~
最后总结一下这三个函数在生成伪随机数的时候是怎么配合的。
首先,time()获取了系统时间;然后,srand()把获取到的系统时间设置为rand()的“种子”;最后,由rand()通过计算,把“种子”转换为一个数字。
好啦,这篇文章就写到这里了~
欢迎大家访问我的网站:https://bfss.github.io/,如果觉得我的文章帮到了您,可以在网站上点击“支持我”对我进行鼓励哟~(手机端网页在左上角,电脑端网页在右上角)
https://www.bilibili.com/read/cv311534
出处: bilibili
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询