随机数生成c语言,C语言如何编程产生随机数?
随机数生成c语言,C语言如何编程产生随机数?详细介绍
本文目录一览: c语言随机数怎么生成
在实际编程中,我们经常需要生成随机数。在c语言中我们通常使用rand方法生成随机数,在调用rand前需要调用srand初始化随机数种子。
电脑:华为MateBook14
系统:Windows10
软件:notepad++等编辑器、gcc编译器1.0
1、使用rand函数生成随机数,rand随机生成一个位于0~RAND_MAX之间的整数。如下图中,我们直接使用rand方法生成10个随机数。
2、程序运行后生成了随机数,但直接使用rand的问题在于,在下次程序调用时,生成的随机数与上次一致。所以,rand函数虽然生成随机数,但可以说是一个伪随机。因为每次调用时,生成数字顺序都是固定的。
3、为了在每次调用时生成不同的随机数,使用srand函数初始化随机数种子。只要随机数种子变化了,那么生成的随机数就会改变。通常,srand使用当前时间作为种子。
4、但使用时间作为随机数种子是否安全呢?我们目前程序执行的速度都太快了,一秒钟对于计算机来说太漫长了。我们将生成随机数的操作定义为函数,然后调用函数两次,看生成的随机数仍然时一样。
5、优化函数也比较简单,在使用时间的基础上,我们还加上一个定增序号。这样能保证就算同一秒钟内多次调用,随机数的种子都是不一样的。
6、通常,我们需要获取一定范围内的随机数。所以,在生成随机数之后我们使用模运算获取对应范围内的数据。如生成0到100内的随机数。
用C语言编写一个可以产生1~99随机数的函数
程序如下:
#include "conio.h"
#include "stdio.h"
#include "stdlib.h" /*这句话是必不可少的*/
main()
{
int a;
randomize(); /*随机数种子*/
a=rand()%99+1;
printf("%d",a);
getch();
}
如果楼主还有问题可以联系我~~~一起讨论讨论啊、、、、
#include
#include
#include
void main()
{
int a,i;
srand((unsigned)time(NULL));//初始化随机数
for(i=0;i<200;i++)
{
a=rand()%99+1;//随机数的产生调用rand()函数
printf("%d\n",a);
}
}
#include
#include
#include
int random()
{
int intrand;
intrand = rand()%99 + 1;
return intrand;
}
void main()
{
// srand种子函数,使随机函数每次都产生不同的值
// time产生系统时间,主要用来产生不同的种子
srand(time(0));
printf("%d\n",random());
}
可以使用C语言标准库中的srand()和rand()来生成随机数,同时要生成1~99之间的随机数,只需要将生成的随机数与99整除,取其余数+1即可保证所有产生的随机数在[1,99]的区间之内。示例代码如下:
#include
#include
#include
int main(){int a,i;srand((unsigned)time(NULL));//初始化随机数for(i=0;i<200;i++){a=rand()%99+1;//随机数的产生调用rand()函数printf("%d\t",a);}printf("\n");return 0;}
C语言如何编程产生随机数?
1、首先打开Visual stdio 2019,依次点击文件,新建,项目新建以一个空白的项目:
2、新建新项目以后,右键点击左边的源文件,选择添加,点击添加项:
3、选择cpp,并将下方的扩展名改为.c,然后点击确定:
4、接下来就可以用编译器编译,使用rand()函数产生C语言的随机数,需要加入stdlib.h和time.h在表头,rand()函数需要给srand()函数提供一个参数,不然系统会给定一个默认的参数,如果参数为一任意的常量的话,得到的也是伪随机数:
4、按ctrl+F5就可以运行程序了,在弹出的窗口中就会看到得到的所有随机数了:
怎么在vc++6.0中用C语言产生随机数?
1、rand返回0-RAND_MAX之间均匀分布的伪随机整数。 RAND_MAX必须至少为32767。rand()函数不接受参数,默认以1为种子(即起始值)。 随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义。
2、 比较理想的是用变化的数,比如时间来作为随机数生成器的种子。 time的值每时每刻都不同。所以种子不同,所以,产生的随机数也不同。
// C++随机函数(VC program) #include
#include
#include
using namespace std; #define MAX 100 int main(int argc, char* argv[]) { srand( (unsigned)time( NULL ) );//srand()函数产生一个以当前时间开始的随机种子 for (int i=0;i<10;i++) cout<
<rand()%max<<endl; max为最大值,其随机域为0~max-1 return 0; }
</rand()%max<
c语言,如何产生随机数
1、第一步,先定义int一个数组和int一个指针变量。
2、接着我们选择让指针指向数组的第一元素的地址。
3、接着使循环的条件为指针的尾地址。
4、并且因为这段代码每次循环后指针+1。
5、最后,让他进行输出。
6、最后编译运行完成后,便可以看到运行结果。
有三种方式,分别适用于不同的需求。
如果需要的随机数范围在0到2147483647之间,直接调用rand()函数就行了。例如:
如果需要的随机数在一定范围,可以在宏定义中定义一个random(int number)函数,然后在main()里面直接调用:
例如:随机生成10个0~100的数:
以上两种方式产生的随机数都是一次性的,如果你第二次运行的时候输出结果仍和第一次一样。连续产生不同的随机数如下如下
例如:
srand((int)time(NULL));设定随机数种子
rand()%100;产生0-99的随机数。高级点的,假如要产生16-59之间的数,你可以这样写:rand()%44+16(这里44由59-16+1得到)。其他情况如法炮制!
下面是搜回来的:
问题1: 怎样获得一个真正的随机数?要知道,rand()是不能产生真正的随机数的!即使不能产生真正的随机数,也要大概接近呀!而rand()好象每次的随机都一样。
专家解答:
之所以rand()每次的随机数都一样是因为rand()函数使用不正确。各种编程语言返回的随机数(确切地说是伪随机数)实际上都是根据递推公式计算的一组数值,当序列足够长,这组数值近似满足均匀分布。如果计算伪随机序列的初始数值(称为种子)相同,则计算出来的伪随机序列就是完全相同的。这个特性被有的软件利用于加密和解密。加密时,可以用某个种子数生成一个伪随机序列并对数据进行处理;解密时,再利用种子数生成一个伪随机序列并对加密数据进行还原。这样,对于不知道种子数的人要想解密就需要多费些事了。当然,这种完全相同的序列对于你来说是非常糟糕的。要解决这个问题,需要在每次产生随机序列前,先指定不同的种子,这样计算出来的随机序列就不会完全相同了。你可以在调用rand()函数之前调用srand( (unsigned)time( NULL ) ),这样以time函数值(即当前时间)作为种子数,因为两次调用rand函数的时间通常是不同的,这样就可以保证随机性了。你也可以使用srand函数来人为指定种子数。Windows 9x/NT的游戏FreeCell就允许用户指定种子数,这样用户如果一次游戏没有成功,下次还可以以同样的发牌结果再玩一次。
问题2: 我按照上述方法并不能产生随机数,仅产生公差为3或4的等差数列:
#include
#include
#include
#include
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++)
{
//相关语句
}
具体代码如下:
#include
#include
#include
//用到了time函数
int main()
{ int i,number;
srand((unsigned) time(NULL)); //用时间做种,每次产生随机数不一样
for (i=0; i<50; i++)
{
number = rand() % 101; //产生0-100的随机数
printf("%d ", number);
}
return 0;
}
有以下几种情况:
(1) 如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间。RAND_MAX定义在stdlib.h, 其值为2147483647。
(2) 如果你要随机生成一个在一定范围的数,你可以在宏定义中定义一个random(int number)函数,然后在main()里面直接调用random()函数:
例如:
rand()%100是产生0-99的随机数。
(3)但是上面两个例子所生成的随机数都只能是一次性的,如果你第二次运行的时候输出结果仍和第一次一样。这与srand()函数有关。srand()用来设置rand()产生随机数时的随机数种子。在调用rand()函数产生随机数前,必须先利用srand()设好随机数种子(seed), 如果未设随机数种子, rand()在调用时会自动设随机数种子为1。上面的两个例子就是因为没有设置随机数种子,每次随机数种子都自动设成相同值1 ,进而导致rand()所产生的随机数值都一样。
srand()函数定义 : void srand (unsigned int seed);
通常可以利用geypid()或time(0)的返回值来当做seed。如果你用time(0)的话,要加入头文件#include
c语言中的随机数是伪随机,真正意义上的随机应该是和上一状态无关的,所以设置srand就显得尤为重要了
下面是linux中stdlib的实现,供参考:
static long holdrand = 1L;
void srand(unsigned int seed)
{
holdrand = (long) seed;
}
int rand()
{
return (((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
}
本文由青松原创并依GPL-V2及其后续版本发放,转载请注明出处且应包含本行声明。\x0d\x0a\x0d\x0aC++中常用rand()函数生成随机数,但严格意义上来讲生成的只是伪随机数(pseudo-random integral number)。生成随机数时需要我们指定一个种子,如果在程序内循环,那么下一次生成随机数时调用上一次的结果作为种子。但如果分两次执行程序,那么由于种子相同,生成的“随机数”也是相同的。\x0d\x0a\x0d\x0a在工程应用时,我们一般将系统当前时间(Unix时间)作为种子,这样生成的随机数更接近于实际意义上的随机数。给一下例程如下:\x0d\x0a\x0d\x0a#include \x0d\x0a#include \x0d\x0a#include \x0d\x0ausing namespace std;\x0d\x0a\x0d\x0aint main()\x0d\x0a{\x0d\x0a double random(double,double);\x0d\x0a srand(unsigned(time(0)));\x0d\x0a for(int icnt = 0; icnt != 10; ++icnt)\x0d\x0a cout << "No." << icnt+1 << ": " << int(random(0,10))<< endl;\x0d\x0a return 0;\x0d\x0a}\x0d\x0a\x0d\x0adouble random(double start, double end)\x0d\x0a{\x0d\x0a return start+(end-start)*rand()/(RAND_MAX + 1.0);\x0d\x0a}\x0d\x0a/* 运行结果\x0d\x0a* No.1: 3\x0d\x0a* No.2: 9\x0d\x0a* No.3: 0\x0d\x0a* No.4: 9\x0d\x0a* No.5: 5\x0d\x0a* No.6: 6\x0d\x0a* No.7: 9\x0d\x0a* No.8: 2\x0d\x0a* No.9: 9\x0d\x0a* No.10: 6\x0d\x0a*/\x0d\x0a利用这种方法能不能得到完全意义上的随机数呢?似乎9有点多哦?却没有1,4,7?!我们来做一个概率实验,生成1000万个随机数,看0-9这10个数出现的频率是不是大致相同的。程序如下:\x0d\x0a#include \x0d\x0a#include \x0d\x0a#include \x0d\x0a#include \x0d\x0ausing namespace std;\x0d\x0a\x0d\x0aint main()\x0d\x0a{\x0d\x0a double random(double,double);\x0d\x0a int a[10] = ;\x0d\x0a const int Gen_max = 10000000;\x0d\x0a srand(unsigned(time(0)));\x0d\x0a \x0d\x0a for(int icnt = 0; icnt != Gen_max; ++icnt)\x0d\x0a switch(int(random(0,10)))\x0d\x0a {\x0d\x0a case 0: a[0]++; break;\x0d\x0a case 1: a[1]++; break;\x0d\x0a case 2: a[2]++; break;\x0d\x0a case 3: a[3]++; break;\x0d\x0a case 4: a[4]++; break;\x0d\x0a case 5: a[5]++; break;\x0d\x0a case 6: a[6]++; break;\x0d\x0a case 7: a[7]++; break;\x0d\x0a case 8: a[8]++; break;\x0d\x0a case 9: a[9]++; break;\x0d\x0a default: cerr << "Error!" << endl; exit(-1);\x0d\x0a }\x0d\x0a \x0d\x0a for(int icnt = 0; icnt != 10; ++icnt)\x0d\x0a cout << icnt << ": " << setw(6) << setiosflags(ios::fixed) << setprecision(2) << double(a[icnt])/Gen_max*100 << "%" << endl;\x0d\x0a \x0d\x0a return 0;\x0d\x0a}\x0d\x0a\x0d\x0adouble random(double start, double end)\x0d\x0a{\x0d\x0a return start+(end-start)*rand()/(RAND_MAX + 1.0);\x0d\x0a}\x0d\x0a/* 运行结果\x0d\x0a* 0: 10.01%\x0d\x0a* 1: 9.99%\x0d\x0a* 2: 9.99%\x0d\x0a* 3: 9.99%\x0d\x0a* 4: 9.98%\x0d\x0a* 5: 10.01%\x0d\x0a* 6: 10.02%\x0d\x0a* 7: 10.01%\x0d\x0a* 8: 10.01%\x0d\x0a* 9: 9.99%\x0d\x0a*/\x0d\x0a可知用这种方法得到的随机数是满足统计规律的。\x0d\x0a\x0d\x0a另:在Linux下利用GCC编译程序,即使我执行了1000000次运算,是否将random函数定义了inline函数似乎对程序没有任何影响,有理由相信,GCC已经为我们做了优化。但是冥冥之中我又记得要做inline优化得加O3才行...\x0d\x0a\x0d\x0a不行,于是我们把循环次数改为10亿次,用time命令查看执行时间:\x0d\x0achinsung@gentoo ~/workspace/test/Debug $ time ./test \x0d\x0a0: 10.00%\x0d\x0a1: 10.00%\x0d\x0a2: 10.00%\x0d\x0a3: 10.00%\x0d\x0a4: 10.00%\x0d\x0a5: 10.00%\x0d\x0a6: 10.00%\x0d\x0a7: 10.00%\x0d\x0a8: 10.00%\x0d\x0a9: 10.00%\x0d\x0a\x0d\x0areal 2m7.768s\x0d\x0auser 2m4.405s\x0d\x0asys 0m0.038s\x0d\x0achinsung@gentoo ~/workspace/test/Debug $ time ./test \x0d\x0a0: 10.00%\x0d\x0a1: 10.00%\x0d\x0a2: 10.00%\x0d\x0a3: 10.00%\x0d\x0a4: 10.00%\x0d\x0a5: 10.00%\x0d\x0a6: 10.00%\x0d\x0a7: 10.00%\x0d\x0a8: 10.00%\x0d\x0a9: 10.00%\x0d\x0a\x0d\x0areal 2m7.269s\x0d\x0auser 2m4.077s\x0d\x0asys 0m0.025s\x0d\x0a\x0d\x0a前一次为进行inline优化的情形,后一次为没有作inline优化的情形,两次结果相差不大,甚至各项指标后者还要好一些,不知是何缘由...
</rand()<
如何在C语言中生成一定范围内的随机数?
srand((int)time(NULL));设定随机数种子rand()%100;产生0-99的随机数。
高级点的,假如要产生16-59之间的数,你可以这样写:rand()%44+16(这里44由59-16+1得到)。其他情况如法炮制!
C语言中用rand()函数产生20-90的随机整数
20-90共有71个数字,所以是rand()%71+20 ;
用rand()生成-20-20的随机数
-20-20共有41个数字,所以是rand()%41-20;
需要注意的是,在运行以上代码之前最好设定一下:
srand(time(NULL));//用系统当前时间设置rand()随机序列种子,保证每次运行随机序列不一样
C语言 如何随机生成数组?
C99的一个特性动态数组,长度随你
使用rand()函数+循环语句可生成一组随机数组。
1、C语言提供了一些库函数来实现随机数的产生。C语言中有三个通用的随机数发生器,分别为 rand函数, random函数, randomize 函数。rand函数产生的并不是真意正义上的随机数,是一个伪随机数,是根据一个数,称之为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数。但这不是真正的随机数,C提供了srand()函数,它的原形是void srand( int a),用来设置一个种子数。在调用rand函数产生随机数前,应该先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。2、例程:
#include
#include
#include
void main(){
srand((unsigned)time(NULL)); //用当前系统时间设置种子
int a[100];
printf("随即初始化数组的100个数(范围是0~100).\n");
for(int i=0;i<100;i++){
a[i]=rand()%101; //用rand函数生成0-100的随机数,并赋值给数组a[i]
printf("%4d",a[i]);
if(i%10==0 && i!=0)
printf("\n");
}
getchar();
}
如何用c语言产生一定范围内的随机数?
利用srand((unsigned int)(time(NULL))是一种方法,因为每一次运行程序的时间是不同的。
在C语言里所提供的随机数发生器的用法:现在的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数。它们就是rand()和srand()函数。这二个函数的工作过程如下:
1) 首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;
2) 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)
3) 根据需要多次调用rand(),从而不间断地得到新的随机数;
4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。
下面是0~32767之间的随机数程序:
#include
#include
#include
// 使用当前时钟做种子
void main(void)
{int i;
srand((unsigned)time( NULL ) ); // 初始化随机数
for(i = 0; i < 10;i++) // 打印出 10 个随机数
printf("%d\n", rand() );
}
根据上面的程序可以很容易得到0~1之间的随机数:
#include
#include
#include
int main( )
{int i;
srand((unsigned)time( NULL ) );
for(i = 0; i < 10;i++)
printf("%5.2f\n", rand()/32767.0);
}
而产生1~100之间的随机数可以这样写:
#include
#include
#include
int main( )
{int i;
srand((unsigned)time( NULL ) );
for(i = 0; i < 10;i++)
printf("%d\n", rand()%100+1);
}
扩展资料:
C语言高效编程技巧:
一:以空间换时间
计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题
二:数学方法解决问题
数学是计算机之母,没有数学的依据和基础,就没有计算机发展,所以在编写程序的时候,采用一些数学方法会对程序的执行效率有数量级的提高。
三:使用位操作
实现高效的C语言编写的第三招----使用位操作,减少除法和取模的运算。
在计算机程序中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作。一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效提高程序运行的效率。
参考资料来源:百度百科-C语言
怎么用C语言生成随机数
生成1~13的随机数,随机数序列中没有重复字数
#include
#include
// 包含rand()函数说明
#include
#define N 13
void main( void )
{ inti, j, num[N], tmp; //用当前时间种子重置随机数生成器,使每次运行生成不同的随机数
srand((unsigned)time( NULL ) );
for(i=0;i
<n;i++) 生成n个数
{
while(1) //生成1个数
{
tmp=N *rand()/ RAND_MAX +1; // 产生随机数
for(j=0;j
<i;j++) 判断是否重复
if( tmp==num[j] )
break;
if(j==i) // 找到1个数
{
num[i]=tmp; //入队列
break; // 开始下一轮
}
} printf("%3d\t",num[i]); //打印结果
}
}
如果可以重复,去掉内循环,直接将生成的随机数存入数组。
srand(int)来设种子,然后每次rand()返回一个随机数。
注意要包含#include
头文件,因为用到了srand函数
#include
//用到了time函数 int main(){ srand((unsigned) time(NULL)); //用时间做种,每次产生随机数不一样 for (int i=0; i<10; i++) { int number = rand() % 12 + 1; //产生1-13的随机数 printf("%d\n", number); } return 0;}
产生一定范围随机数的通用表示公式
要取得[a,b)的随机整数,使用(rand() % (b-a))+ a;
要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a;
要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1;
通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。
要取得a到b之间的随机整数,另一种表示:a + (int)b * rand() / (RAND_MAX + 1)。
要取得0~1之间的浮点数,可以使用rand() / double(RAND_MAX)。
#include
#include
#include
int func(){ return rand() % 13 + 1;//rand()产生0到32767的随机数,模13就得到0到12的随机数,加1就是1到13的随机数}int main(){ srand((unsigned)time(0));//这个也是关键,是放入随机数种子,通常都是放系统当前时间的。 for (int i = 0;i<10;i++) { printf("random : %d\n", func()); } return 0;}
#include
#include
#include
main()
{
int n;
n=10;
int c;
/*如果不加上这一句那么第二次运行的结果是和第一次的是一样的*/
srand((int)time(0));
while(n--)
{
c=rand()%10+4;
printf("%d\n",c);
}
}
假设要生成的随机数是大于等于20且小于等于100的整数
#include
#include
#include
void main() { int a,b,x; a=20; b=100; srand((unsigned int)time(NULL)); //用当前时间生成一个随机数种子 x=rand()%(b-a+1)+a; printf("得到一个随机数:%d\n",x);}
c语言,产生随机数
/***********************
作者:dongyu
功能:生成随机数
***********************/
#include
#include
main()
{
int
i,n,sum=0,mark=1;
srand(time(NULL));//设置随机种子
while(mark==1)//如超出随机数总和的范围,则重新生成随机数
{
sum=0;//将总和归零
system("cls");//清屏
printf("符合条件的200个随机数为:");//打印一个回车
for(i=0;i<200;i++)//循环200次,生成200个随机数
{
if(i%10==0)
printf("\n");
n=rand()%101;//随机数在1-100之间
sum=sum+n;//将生成的随机数累加,存在sum变量中
printf("%d
",n);//输出每次循环生成的随机数
}
if(sum==10000)//判断是否等于确定的随机数总和
{
mark=0;//如果不等,变量mark为0
}
}
printf("\n%d",sum);//输出总和
system("pause");//使程序在DOS窗口下暂停,可注释掉
}
运行程序后,请耐心等待,因为200个100以内的随机数的和,不是很容易就等于确定的总和数(10000)的!!
一楼的感觉第二个数的产生过于麻烦
二楼的不能用int型,因为楼主的要求是1000000内,可能就是999999,int不够用
#include
#include
#include
#define
RAND_MAX
1000000
void
main()
{
long
num1,num2;
time_t
t;
srand((unsigned)
time(&t));/*用时间初始化随机函数*/
int
T;
scanf("%d",&T);
for(int
i=0;i<2*T;i++)
{
num1=rand()%1000000;//产生1000000内的第一个随机数
num2=rand()%num1;//产生num1内的第二个随机数
printf("%ld\t%ld\n",num1,num2);
}
getchar();
getchar();
}
随即生成30个0-20的随机数,并放在了arr数组里
#include
#include
#include
int main( int argc, char * argv[] )
{
int arr[30], i;
srand(time(NULL));
for(i=0;i<30;i++)
{
arr[i] = rand()%20;
}
printf("rand number between 0 and 20:\n");
for(i=0;i<30;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
#include
#include
using namespace std;
void main()
{
srand(time(NULL));
int i=20;
while (i--)
{
int num=(int)((float)rand()/RAND_MAX*21);
cout<
<num<<endl;
}
system("pause");
}
用rand函数可以产生小于32767的随机数,如果需要的随机数范围超过了32767,可以用rand()*rand()来产生,举例如下:
产生0~32767范围内的随机数:int num = rand();
产生0-20范围内的随机数:int num = rand()%20;
产生0~10000000范围内的随机数:int num = rand()*rand()%10000000;
注:需要包含头文件
</num<<endl;