可以获得一个非负整数的随机数。要调用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的随机整数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)