如何在C语言中产生一定范围的随机数

如何在C语言中产生一定范围的随机数,第1张

c语言的获取随机数函数为rand(),

可以获得一个非负整数的随机数。要调用rand需要引用头文件stdlibh。

要让随机数限定在一个范围,可以采用模除加加法的方式。

要产生随机数r,

其范围为

m<=r<=n,可以使用如下公式:

rand()%(n-m+1)+m

其原理为,对于任意数,

0<=rand()%(n-m+1)<=n-m

于是

0+m<=rand()%(n-m+1)+m<=n-m+m

m<=rand()%(n-m+1)+m<=n

C 库函数 int rand(void) 返回一个范围在 0 到 RAND_MAX 之间的伪随机数。

RAND_MAX 是一个常量,它的默认值在不同的实现中会有所不同,但是值至少是 32767。

C 库函数 void srand(unsigned int seed) 播种由函数 rand 使用的随机数发生器。

例子:

#include <stdioh>

#include <stdlibh>

#include <timeh>

int main()

{

int i, n;

time_t t;  

n = 5;  

  / 初始化随机数发生器 /

srand((unsigned) time(&t));

  / 输出 0 到 50 之间的 5 个随机数 /

for( i = 0 ; i < n ; i++ ) {    printf("%d\n", rand() % 50);   }

return(0);

}

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

进一步说明:计算机并不能产生真正的随机数,而是已经编写好的一些无规则排列的数字存储在电脑里,把这些数字划分为若干相等的N份,并为每份加上一个编号用srand()函数获取这个编号,然后rand()就按顺序获取这些数字,当srand()的参数值固定的时候,rand()获得的数也是固定的,所以一般srand的参数用time(NULL),因为系统的时间一直在变,所以rand()获得的数,也就一直在变,相当于是随机数了。

只要用户或第三方不设置随机种子,那么在默认情况下随机种子来自系统时钟。如果想在一个程序中生成随机数序列,需要至多在生成随机数之前设置一次随机种子。即:只需在主程序开始处调用 srand((unsigned)time(NULL)); 后面直接用rand就可以了。不要在 for 等循环放置 srand((unsigned)time(NULL));

摘自runoo

题目是从CU上看到的,我的算法是:

int rand7()

{

int a;

while( (a=rand5()5+rand5()) > 26 );

return (a-3)/3;

}

可惜没办法验证,不知道这个算法是否正确?(问题一)。

(验证方法是通过双循环将两个rand5()分别换成1 2 3 4 5,但剔除掉(5,2)(5,3)(5,4)(5,5)这四个组合)

算法思路是:

1 通过 rand5()5+rand5() 产生 6 7 8 9 10 11 …… 26,27 28 29 30 这25个数,每个数的出现机率相等

2 只需要前面 37 个数,所以舍弃后面的4个数

3 将 6 7 8 转化为 1,9 10 11 转化为 2,……,24 25 26 转化为 7。公式是 (a-3)/3

注:

我觉得不能将 while( (a=rand5()5+rand5()) > 26 ) 其中一个rand5()移到while之外,即不能写成

int b = rand5();

int a;

while( (a=b5+rand5()) > 26 ); 或 while( (a=rand5()5+b) > 26 );

因为出现 >26 的情况,说明 b 有很大机率很大,从而又导致while之后的a有很大机率很大,破坏了平衡性。

这个备注中的看法对么?

1、可以使用while函数,对随机进行循环

2、直接在随机数中去掉170这个值

扩展资料:

除了randint,random模块中比较常用的方法还有:

1、randomrandom()

生成一个0到1之间的随机浮点数,包括0但不包括1,也就是[00, 10)。

2、randomuniform(a, b)

生成a、b之间的随机浮点数。不过与randint不同的是,a、b无需是整数,也不用考虑大小。

randomuniform(22, 6)

randomuniform(6,22)

这两种参数都是可行的。

3、randomchoice(seq)

从序列中随机选取一个元素。seq需要是一个序列,比如list、元组、字符串。

randomchoice([1, 4, 7, 2, 5, 8]) #list

randomchoice('hello') #字符串

randomchoice((1, 2, 3)) #元组

都是可行的用法。

void main()

{

int num[600];

int a=1,b=255;//想要一组600个在1,255的随机数

srand((unsigend)time(0)); //1、移动到这里,2、去掉那组()

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

num[i]=rand()()%(int)(b-a+1)+a;

应该是a[2][3]={{1,3,2},{8,0,3}} 吧

#include <iostream> //cout函数的头文件

#include <cstdlib>

#include <timeh> / srand函数与rand函数的头文件/

using namespace std;

int main()

{

int a[2][3]={{1,3,2},{8,0,3}},x,y,z;

srand ( (unsigned) time (NULL) );

x=rand()%2; //调用随机函数

y=rand()%3; //调用随机函数

z=a[x][y];

cout<<z<<"\n";

system ("pause");

return 0;

}

三楼,请注意素质

那是我的版权!!

楼主,一定要注意先来后到!

我本是2楼的,后因稍作修改,没想到3楼抄袭我。。。

以上就是关于如何在C语言中产生一定范围的随机数全部的内容,包括:如何在C语言中产生一定范围的随机数、rand()和srand()有什么区别啊用的时候应该分别怎么用啊书上没有(大哭)、如何获取1-5的随机整数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9558397.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存