C语言中获得随机数的方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中获得随机数的方法相关的知识,希望对你有一定的参考价值。

C语言/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,C语言/C++里没有自带的random(int number)函数。
(1) 如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间。RAND_MAX定义在stdlib.h, 其值为2147483647。
例如:#include<stdio.h>
#include<stdlib.h>
void main()

for(int i=0;i<10;i+)
printf("%d\n",rand());
(2) 如果你要随机生成一个在一定范围的数,你可以在宏定义中定义一个random(int number)函数,然后在main()里面直接调用random()函数:例如:随机生成10个0~100的数:
#include<stdio.h>
#include<stdlib.h>
#define random(x) (rand()%x)

void main()

for(int x=0;x<10;x++)
printf("%d\n",random(100));
(3)但是上面两个例子所生成的随机数都只能是一次性的,如果你第二次运行的时候输出结果仍和第一次一样。这与srand()函数有关。srand()用来设置rand()产生随机数时的随机数种子。在调用rand()函数产生随机数前,必须先利用srand()设好随机数种子(seed), 如果未设随机数种子, rand()在调用时会自动设随机数种子为1。上面的两个例子就是因为没有设置随机数种子,每次随机数种子都自动设成相同值1 ,进而导致rand()所产生的随机数值都一样。srand()函数定义 : void srand (unsigned int seed);
通常可以利用geypid()或time(0)的返回值来当做seed
如果你用time(0)的话,要加入头文件#include<time.h>例如:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define random(x) (rand()%x)

void main()
srand((int)time(0));
for(int x=0;x<10;x++)
printf("%d\n",random(100));
这样两次运行的结果就会不一样了!!
参考技术A 问题1: 怎样获得一个真正的随机数?要知道,rand()是不能产生真正的随机数的!即使不能产生真正的随机数,也要大概接近呀!而rand()好象每次的随机都一样。

专家解答:

之所以rand()每次的随机数都一样是因为rand()函数使用不正确。各种编程语言返回的随机数(确切地说是伪随机数)实际上都是根据递推公式计算的一组数值,当序列足够长,这组数值近似满足均匀分布。如果计算伪随机序列的初始数值(称为种子)相同,则计算出来的伪随机序列就是完全相同的。这个特性被有的软件利用于加密和解密。加密时,可以用某个种子数生成一个伪随机序列并对数据进行处理;解密时,再利用种子数生成一个伪随机序列并对加密数据进行还原。这样,对于不知道种子数的人要想解密就需要多费些事了。当然,这种完全相同的序列对于你来说是非常糟糕的。要解决这个问题,需要在每次产生随机序列前,先指定不同的种子,这样计算出来的随机序列就不会完全相同了。你可以在调用rand()函数之前调用srand( (unsigned)time( NULL ) ),这样以time函数值(即当前时间)作为种子数,因为两次调用rand函数的时间通常是不同的,这样就可以保证随机性了。你也可以使用srand函数来人为指定种子数。Windows 9x/NT的游戏FreeCell就允许用户指定种子数,这样用户如果一次游戏没有成功,下次还可以以同样的发牌结果再玩一次。

问题2: 我按照上述方法并不能产生随机数,仅产生公差为3或4的等差数列:
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
#include <time.h>
void main()

for(int i=0;i<100000;i++)

srand( (unsigned)time( NULL ) );
cout<<rand()<<endl;


专家解答:
你的程序是有问题的,你每产生一个随机数之前,都调用一次srand,而由于计算机运行很快,所以你每次用time得到的时间都是一样的(time的时间精度较低,只有55ms)。这样相当于使用同一个种子产生随机序列,所以产生的随机数总是相同的。你应该把srand放在循环外:
srand( (unsigned)time( NULL ) );
for(int i=0;i<100000;i++)

//相关语句
参考技术B 可以使用库函数rand()。
rand声明于stdlib.h,其原型为

int rand(void);
功能为返回一个随机整型值。在C语言中,该值是一个正数值。

在需要限定获取到的随机数范围时,如范围要求为[m,n] m<n且m,n均为整数,可以用
rand()%(n-m+1)+m
的形式进行获取。原理为:
%为取余计算,当%k时,结果是[0,k-1]之间的数值;
于是rand()%(n-m+1) ∈ [0, n-m];
所以rand()%(n-m+1)+m ∈ [0+m, n-m+m]=[m,n]。
参考技术C C语言生成随机数需要用到两个函数,一个是srand(),一个是rand(),首先给srand()提供一个种子,unsigned int类型,其取值范围从0~65535,srand()根据这个种子会由一个特定的公式生成一个随机数序列;然后调用rand(),它会依次从这个序列中返回一个数(在0到32767之间),而在不指定srand()种子的情况下,它每次都使用默认的种子,因此生成的序列是同一个,你每次运行,当然就取到相同的数字了。

你可以在程序里添加头文件time.h,用当前时间作为srand的种子,这样就能保证每次运行时都能取到不同的随机数序列。如下:
time_t t;
srand((unsigned) time(&t));
然后就可以用rand()取随机数了。
参考技术D 在VC中设计到随机数有两个函数

srand() and rand()

srand() 的作用是是一个种子,提供每次获得随机数的基数而已,rand()根据种子而产生随机数

注意

1:srand() 里的值必须是动态变化的,否则得到的随机数就是一个固定数

2:其实可以不用写srand() ,只用rand()就可以了,省事,简单,例子如下

如果我们想得到一个 0-60的随机数那么可以写成

int i;

i=rand()%60;

就可以了。

当然最好有个统一的标注如下:

int i;

srand((unsigned)time( NULL ));

i=rand()%60;

这样就OK了。

如何在c语言的cooja模拟器中获得一个随时间变化的随机数?

【中文标题】如何在c语言的cooja模拟器中获得一个随时间变化的随机数?【英文标题】:How to have a random number which changes with time in cooja simulator in c language? 【发布时间】:2020-04-03 12:41:50 【问题描述】:

我知道有类似的帖子。我已经尝试了所有这些。但这并不能回答我的问题。我已经尝试过由 c 提供的 srand,但它在 cooja 中不起作用。 我也试过#include "cfs/cfs.h"#include "cfs/cfs-coffee.h"。但这提供了静态随机数。

【问题讨论】:

srand 和 rand 如何在 cooja 中不起作用? @Aplet123 rand 正在工作,但 cooja 中没有 #include。我想使用这个库,因为它使用当前时间作为随机生成器的种子,如下所示:srand(time(0)); 【参考方案1】:

使用node_id初始化随机数生成器。

在 Contiki 中,您应该使用 random_init()random_rand() 而不是 C 库函数:

#include <sys/node-id.h>
/* ... */

random_init(node_id);
unsigned short r = random_rand();

编辑:这将在不同节点上为您提供不同的随机数。如果您想在不同的模拟运行中使用不同的随机数,您可以使用 Cooja mote 平台。它从 simRandomSeed 变量初始化 Contiki RNG,这是模拟的随机种子,您可以每次设置为不同的值(从命令行或在 .csc 文件中)。

如果您不使用 Cooja 微尘,并且不想在不同的模拟运行中分配不同的节点 ID,则唯一的选择是通过外部接口获取微尘上的随机种子,例如通过串口发送并在节点上读取。

【讨论】:

但是节点id是静态的,所以每次都会创建相同的一组随机数。我每次都想要一组不同的随机数。 如果你每次都能说出随机的东西。所以我可以把它放在 random_init 中。 哪个头文件包含 simRandomSeed?当我收到错误消息时:未声明“simRandomSeed”(在此函数中首次使用) 你可以自己声明为extern int simRandomSeed,可惜没有头文件。 ***.com/questions/61010848/… 你能不能也看看这些问题。

以上是关于C语言中获得随机数的方法的主要内容,如果未能解决你的问题,请参考以下文章

如何用C语言生成时间的随机数

C语言怎么产生0-100之间1个随机数

C语言如何实现随机事件

C语言中随机函数每次调用的随机序列是不是一样?

产生一个随机数(伪随机)的一种方法(c语言)

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