当前位置:首页 » 编程语言 » c语言伪随机数

c语言伪随机数

发布时间: 2024-08-14 05:27:39

c语言中rand()%m是啥意思

rand()%m这个函数是随机产生0到m-1的随机数;比如rand()%10就是随机产生0到9的随机数。

拓展资料

使用C语言的rand函数,生成的是伪随机数;

c语言之rand函数的使用

1、写入头文件

生成随机数rand函数的用法:

函数rand()是真正的随机数生成器,而srand()会设置供rand()使用的随机数种子。如果你在第一次调用rand()之前没有调用srand(),那么系统会为你自动调用srand()。而使用同种子相同的数调用 srand()会导致相同的随机数序列被生成。

srand((unsigned)time(NULL))则使用系统定时/计数器的值做为随机种子。每个种子对应一组根据算法预先生成的随机数,所以,在相同的平台环境下,不同时间产生的随机数会是不同的,相应的,若将srand(unsigned)time(NULL)改为srand(TP)(TP为任一常量),则无论何时运行、运行多少次得到的“随机数”都会是一组固定的序列,因此srand生成的随机数是伪随机数。

⑵ C语言怎样产生一定范围的随机数

在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,可以称它为种子。

为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数。

C语言产生一定范围的随机数的源代码如下:

#include<stdio.h>

#include<stdlib.h>

int main()

{

int i;

for(i=0; i<10; i++) //随机产生10个数。

{

printf("%d ", rand());

}

return 0;

}

(2)c语言伪随机数扩展阅读

1、如果要随机生成一个在一定范围的数,你可以在宏定义中定义一个random(int number)函数,然后在main()里面直接调用random()函数。

2、在对rand()的前三次调用中,并且此后得到的返回值仍然是在对rand()的第一批调用中所得到的其余的返回值。因此,只有再次给srand()提供一个随机的“种子”值,才能再次得到一个随机数。

⑶ C语言编程中生成随机数的初级教程

几个概念

随机数:数学上产生的都是伪随机数,真正的随机数使用物理方法产生的。

随机数种子:随机数的产生是由算术规则产生的,srand(seed)的随机数种子不同,rand()的随机数值就不同,倘若每次的随机数种子一样,则rand()的值就一样。所以要产生随机数,则srand(seed)的随机数种子必须也要随机的。

用srand()产生随机数种子

原型:void srand ( unsigned int seed );

作用是设置好随机数种子,为了让随机数种子是随机的,通常用time(NULL)的值来当seed。

time()用于随机数种子

函数原型:time_t time ( time_t * timer );

time()函数表示返回1970-1-1 00:00:00 到当前时间的秒数。

用的时候这样:srand(unsigned(time(NULL)));例如产生1~10之间的随机整数

#include#includeint main(){ srand(time(NULL)); for(int i=0;i < 10;i++) { int randValue=rand()%10; }}

上面的程序中要注意srand是在for循环外面的,如果把srand放到for循环里面,则每次产生的随机数都相同。

用rand()产生随机数

原型:int rand ( void );

作用是产生一个随机数,当然随机数是有范围的,为0~RAND_MAX之间,随机数与随机数种子有关。具体来说是,在产生随机数 rand()被调用的时候,它会这样执行:

如果用户之前调用过 srand(seed)的话,他会重新调用一遍 srand(seed)以产生随机数种子;

如果发现没有调用过 srand(seed)的话,会自动调用 srand(1)一次。

如果调用srand(seed)产生的随机数种子是一样的.话(即seed的值相同),rand()产生的随机数也相同。

所以,如果希望rand()每次调用产生的值都不一样,就需要每次调用srand(seed)一次,而且seed不能相同。这里就是经常采用time(NULL)产生随机数种子的原因。

C语言中可以使用rand()函数来生成一个从0到RAND_MAX的uniform分布。基于这个函数,我们可以构造出一些特定的随机数生成器来满足我们的需求。

(一)0到1的uniform分布:

//generate a random number in the range of [0,1]double uniform_zero_to_one(){ return (double)rand()/RAND_MAX;}

(二)任意实数区间的uniform分布:

//generate a random real number in [start,end]double uniform_real(double start,double end){ double rate=(double)rand()/RAND_MAX; return start+(end-start)*rate;}

(三)任意整数区间的uniform分布:

//generate a random integer number in [start,end)int uniform_integer(int start,int end){ int base=rand(); if(base==RAND_MAX) return uniform_integer(start,end); int range=end-start; int remainder=RAND_MAX%range; int bucket=RAND_MAX/range; if(base<RAND_MAX-remainder) return start+base/bucket; else return uniform_integer(start,end);}

这个函数要特别说明一下,平常时候我们都是用rand()%n来生成0到n-1的随机数,但是按这种方法生成的分布并不是uniform的,另外由于RAND_MAX只有32767,因此要生成比这个数更大的随机数需要另外想办法,理论上可以直接用0到1的uniform分布直接放缩,但实际效果不好。这里给出一种移位方式的实现。

(四)32bits的随机数

//generate a random 32 bits integer number int rand32(){ return ((rand()<<16)+(rand()<<1)+rand()%2);}

有了32bits的随机数生成方法,就可以构造32bits范围内的随机整数区间了,方法和之前16bits的情况一样。

(五)32bits范围内的随机整数区间

//generate a random 32bits integer number in [start,end) int uniform_integer_32(int start,int end){ int base=rand32(); if(base==RAND32_MAX) return uniform_integer_32(start,end); int range=end-start; int remainder=RAND32_MAX%range; int bucket=RAND32_MAX/range; if(base<RAND32_MAX-remainder) return start+base/bucket; else return uniform_integer_32(start,end);}

这里RAND32_MAX定义为0x7fffffff。

除此之外,利用rand()函数构造任意分布的随机数也是个值得探讨的问题。

理论上可以通过(0,1)的uniform分布,加上标准采样方法(sampling)获得。

⑷ 浅析C语言中的伪随机数

哈喽,大家好,我是北方素素~

首先给大家解释一下这个标题,什么叫做“浅析”呢?就是稍微分析一下,哈哈。用了“浅析”就突然感觉高大上了,其实并没有多深奥,只是以链枣羡我的理解给大家解释一下。

我们知道,在一些书籍中,使用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语言中rand()函数怎么用

rand函数功能为获取一个伪随机数(伪随机数的概念下面会有介绍)。

一、函数名:

rand();


二、声明:

int rand();


三、所在头文件:

stdlib.h


四、功能:

返回一个伪随机数。之所以说是伪随机数,是因为在没有其它操作下,每次执行同一个程序,调用rand得到的随机数序列是固定的(不是真正的“随机”)。


五、为了使rand的结果更“真”一些,也就是令其返回值更具有随机性(不确定性),C语言在stdlib.h中还提供了srand函数,通过该函数可以设置一个随机数种子,一般用当前时间的毫秒数来做参数。通过time(NULL)可以获取到当前时间的毫秒值(该函数位于time.h)中。


六、使用rand的流程可以总结为:

1 调用srand(time(NULL))设置随机数种子。

2 调用rand函数获取一个或一系列随机数。

需要注意的是,srand只需要在所有rand调用前,被调用一次即可,没必要调用多次。


七、以下是随机获取10个整型值并输出的例子,辅助理解。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

intmain()
{
inti;

srand(time(NULL));//设置随机数种子。

for(i=0;i<10;i++)//运行10次。
printf("%d ",rand());//每次获取一个随机数并输出。

return0;
}
热点内容
数据库年薪 发布:2024-11-25 17:51:18 浏览:666
王者荣耀如何给账号设置密码 发布:2024-11-25 17:36:48 浏览:759
以巧克力为主写一篇脚本 发布:2024-11-25 17:16:59 浏览:335
数据库课时 发布:2024-11-25 16:57:50 浏览:451
dns服务器名称地址 发布:2024-11-25 16:57:49 浏览:932
如何给监控加访问密码 发布:2024-11-25 16:45:13 浏览:601
国外安卓音乐播放器哪个好 发布:2024-11-25 16:35:58 浏览:143
我的世界服务器增加粒子 发布:2024-11-25 16:28:29 浏览:718
带内核的安卓x86是什么意思 发布:2024-11-25 16:27:01 浏览:273
php了解 发布:2024-11-25 16:16:26 浏览:934