问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c语言,如何产生随机数

发布网友 发布时间:2022-04-23 18:27

我来回答

5个回答

热心网友 时间:2023-08-05 08:46

本文由青松原创并依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优化的情形,两次结果相差不大,甚至各项指标后者还要好一些,不知是何缘由...

热心网友 时间:2023-08-05 08:46

1、第一步,先定义int一个数组和int一个指针变量。

2、接着我们选择让指针指向数组的第一元素的地址。

3、接着使循环的条件为指针的尾地址。

4、并且因为这段代码每次循环后指针+1。

5、最后,让他进行输出。

6、最后编译运行完成后,便可以看到运行结果。

热心网友 时间:2023-08-05 08:46

有三种方式,分别适用于不同的需求。

如果需要的随机数范围在0到2147483647之间,直接调用rand()函数就行了。
例如:

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

例如:随机生成10个0~100的数:

以上两种方式产生的随机数都是一次性的,如果你第二次运行的时候输出结果仍和第一次一样。连续产生不同的随机数如下如下

例如:

热心网友 时间:2023-08-05 08:47

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 <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++)
{
//相关语句
}

热心网友 时间:2023-08-05 08:48

  具体代码如下:
  #include <stdio.h>
#include <stdlib.h>
#include <time.h> //用到了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<time.h>
c语言产生随机数

答案:在C语言中,可以使用标准库函数`rand`来产生随机数。这个函数返回一个伪随机数序列。为了获得更好的随机性,通常会结合使用`srand`函数来设置随机数生成的种子。详细解释:1. rand函数的基本使用:`rand`函数是C标准库中的一个函数,它返回一个伪随机数。这个数是一个整数,范围通常是从0到`RA...

c语言中怎样生成随机数?

在C语言中,可以使用stdlib库中的rand函数生成随机数。详细解释如下:一、rand函数的基本用法 C语言中的rand函数可以生成一个伪随机数。这个函数返回一个在0到RAND_MAX之间的整数,其中RAND_MAX是一个在stdlib库中定义的常数,通常是一个相当大的数。使用rand函数的基本语法是:`rand`,调用这个函数会返...

c语言如何实现随机数字的产生

C提供了srand()函数,它的原形是void srand(int a)。3.在调用rand函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。一般用for语句来设置种子的个数。

c语言怎么生成随机数?

完整的代码,红圈处就是从上面100个数字中抽取到的数字:include &lt;stdio.h&gt;#include&lt;stdlib.h&gt; //生成随机数用 #include //利用时间生成种子 #include&lt;math.h&gt; int main(){ int i; int a[100]; srand( time(NULL) ); //生成种子 for(i=0;i&lt;100;i++) { ...

C语言中生成1个0到1的随机数要执行什么语句啊?

C语言中生成1个0到1的随机数可以执行语句:float b=rand()/(RAND_MAX+1.0);解析:标准C库中函数rand()可以生成0~RAND_MAX之间的一个随机数,其中RAND_MAX 是stdlib.h 中定义的一个整数,它与系统有关。rand()函数没有输入参数,直接通过表达式rand()来引用;用函数rand取得的随机数除以(...

C语言怎么产生30-100的随机数?

代码如下(以产生100个0~70的范围随机数为例):include "stdio.h"#include "stdlib.h"//调用srand和rand需包含此文件#include "time.h"//调用time需包含此文件int main(int argc,char *argv[]){int n,l;srand((unsigned)time(NULL));//调用库函数sran为伪随机产生器下种子for(l=n=0;n&lt;...

怎样用c语言生成n个随机数

产生一定范围随机数的通用表示公式 要取得[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到...

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

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

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

在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,可以称它为种子。为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数。C语言产生一定范围的随机数的源代码如下:include&lt;stdio.h&gt; include...

C语言如何编程产生随机数?

1、首先打开Visual stdio 2019,依次点击文件,新建,项目新建以一个空白的项目:2、新建新项目以后,右键点击左边的源文件,选择添加,点击添加项:3、选择cpp,并将下方的扩展名改为.c,然后点击确定:4、接下来就可以用编译器编译,使用rand()函数产生C语言的随机数,需要加入stdlib.h和time.h在表头...

c语言随机产生随机数 c语言如何生成随机数 c语言中如何随机生成数字 c语言怎么随机产生数 c语言随机产生1到10之间的数 如何产生随机数 c语言生成1~100随机数 c语言随机数生成算法 C语言连续生成多个随机数
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
2024年小麦价格多少钱一斤 酸甜口味的凉拌菜如何制作? 小麦价格什么时候涨 明年小麦还会继续上涨吗 怎么做家常韭菜烧豆腐? 家常烧豆腐块怎么做? 单核CPU512内存 加内存会让电脑运行快吗 我的电脑配置 CPU AMD速龙 双核 3600+ 内存 512MB 显卡64M 什么情况... 我的cpu是AMD Sempron 3000+的 内存是512M 显示卡是 Radeon X300/X550/... 我的电脑是双核CPU 2G内存 512独显 怎样才能加快电脑运行速度 如何用c语言产生一定范围内的随机数? C语言如何编程产生随机数? C语言怎样产生一定范围的随机数? C语言的发展史是怎样的? C语言的产生与发展 小学生学雷锋活动方案 吉多乡小学师生健康中国健康主题教育活动实施方案 小学四年级的班队会活动的方案,急急急!!! 小学生呵护心灵关爱成长活动方案 念慈菇的功效和作用 慈菇能生吃吗,山慈菇的功效与作用及禁忌分别是什么 慈姑怎么做好吃 慈菇瘦肉汤要怎样制作? 茨菇片怎么做 慈菇的营养价值 慈菇的作用与功效有哪些 茨菇的特性及功效.禁忌搭配哪些食物 茨菇怎样烧最美味? 慈姑有什么作用? 茨菇的功效与作用 茨菇怎样做好吃 C语言如何产生一定范围内一定数量的不同随机数 在C语言中如何产生随机数 c语言如何产生在一定范围内的随机数 C语言如何srand和rand函数产生10个1-100内的随机数 领克09phev没电了还是四驱吗 领克09P电池是36a吗? 领克09申请的充电桩多少kw 领克09PHEV挂倒挡有杂音 还在纠结领克09 PHEV和理想one?这里有答案! 兰州地区领克09等车时间 领克09phev保持电量每次都要调吗 领克09tjp跟车时长 30多万预算,国产混动SUV,到底怎么选? 领克09PHEV的工具在哪儿 领克09mhev驾驶模式有几种 领克09预售一个月订单破万,高端及新能源车型更受欢迎 怎样远程控制风行电视? 领克09+PHEV33.59W那款6座, 26.59万起售,领克09导购分析,哪一个版本值得选? 领克09什么时候可以提车?