小米5x nfc8月1日能不能买到

> 用c语言实现产生随机数,随机数大小在1-n(整数),帮帮忙,急用搞了好久,不知道怎么解决种子问题。
用c语言实现产生随机数,随机数大小在1-n(整数),帮帮忙,急用搞了好久,不知道怎么解决种子问题。
morningjie & &
发布时间: & &
浏览:1 & &
回复:1 & &
悬赏:0.0希赛币
用c语言实现产生随机数,随机数大小在1-n(整数),帮帮忙,急用搞了好久,不知道怎么解决种子问题。
或者定义个变量,用变量的地址设置:
srand(&seed); mornlena & &
20:41:42 & &
& & (0)(0)
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&C语言/C++中如何产生随机数
字体:[ ] 类型:转载 时间:
这里要用到的是rand()函数, srand()函数,和time()函数。需要说明的是,iostream头文件中就有srand函数的定义,不需要再额外引入stdlib.h;而使用time()函数需要引入ctime头文件
C语言/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,和time()函数。
需要说明的是,iostream头文件中就有srand函数的定义,不需要再额外引入stdlib.h;而使用time()函数需要引入ctime头文件。
使用rand()函数获取一个随机数如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间。RAND_MAX定义在stdlib.h, 其值为。
例子1.1: 代码如下:#include&iostream&int main(){&for(int i=0;i&10;i++)&{&&cout&&rand()&&&}}结果:
使用rand()函数获取一定范围内的一个随机数
如果想要获取在一定范围内的数的话,直接做相应的除法取余即可。
例子2.1: 代码如下:#include&iostream&int main(){&for(int i=0;i&10;i++)&{&&//产生10以内的整数 &&cout&&rand()%10&&&}}结果:
我们上面获取的都是随机的整数,那么如何获取小数呢?例如:我们可以先获得10001以内的整数(0~10000),然后再用这个整数除以10000得到小数点后两位的小数。
例子2.2: 代码如下:#include&iostream&int main(){&for(int i=0;i&10;i++)&{&&cout&&(rand()%1.0&&&}}注意10000.0后面的有个小数点,表示结果为浮点数。
使用rand函数和time函数我们上面已经可以获取随机数了,为什么还需要使用time函数呢?我们通过多次运行发现,该程序虽然生成了10个随机数,但是这个10个随机数是固定的,也就是说并不随着时间的变化而变化。
这与srand()函数有关。srand()用来设置rand()产生随机数时的随机数种子。在调用rand()函数产生随机数前,必须先利用srand()设好随机数种子(seed), 如果未设随机数种子, rand()在调用时会自动设随机数种子为1。
上面的例子就是因为没有设置随机数种子,每次随机数种子都自动设成相同值1 ,进而导致rand()所产生的随机数值都一样。
srand()函数定义 : void srand (unsigned int seed);
通常可以利用geypid()或time(0)的返回值来当做seed
如果你用time(0)的话,要加入头文件#include&ctime&
time(0)或者time(NULL)返回的是系统的时间(从午夜算起),单位:秒
例子3.1: 代码如下:#include &iostream&#include &ctime&
void main(){&&a=time(0);//time(0)返回的是系统的时间(从午夜算起),单位:秒&cout&&a&&}例子3.2: 代码如下:#include&iostream&#include&ctime&int main(){&srand(time(0)); &for(int i=0;i&10;i++)&{&&//产生10以内的整数 &&cout&&rand()%10&&&}}这样做的话,每次运行的结果就都不一样了。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具C语言中伪随机数在计算机中怎样产生的
学历类|       外语类|     
资格类|       财会类|     
|      医学类|     
计算机|    |        
&&-&&-&&-&正文
C语言中伪随机数在计算机中怎样产生的
编辑:zhoupanyu 【字体:小 大】
大家可能很多次讨论过随机数在计算机中怎样产生的问题,在这篇文章中,我会对这个问题进行更深入的探讨,阐述我对这个问题的理解。
  大家可能很多次讨论过随机数在计算机中怎样产生的问题,在这篇文章中,我会对这个问题进行更深入的探讨,阐述我对这个问题的理解。
  首先需要声明的是,计算机不会产生绝对随机的随机数,计算机只能产生“伪随机数”。其实绝对随机的随机数只是一种理想的随机数,即使计算机怎样发展,它也不会产生一串绝对随机的随机数。计算机只能生成相对的随机数,即伪随机数。
  伪随机数并不是假随机数,这里的“伪”是有规律的意思,就是计算机产生的伪随机数既是随机的又是有规律的。怎样理解呢?产生的伪随机数有时遵守一定的规律,有时不遵守任何规律;伪随机数有一部分遵守一定的规律;另一部分不遵守任何规律。比如“世上没有两片形状完全相同的树叶”,这正是点到了事物的特性,即随机性,但是每种树的叶子都有近似的形状,这正是事物的共性,即规律性。从这个角度讲,你大概就会接受这样的事实了:计算机只能产生伪随机数而不能产生绝对随机的随机数。(严格地说,这里的计算机是指由冯诺依曼思想发展起来的电子计算机。而未来的量子计算机有可能产生基于自然规律的不可重现的 “真”随机数)
  那么计算机中随机数是怎样产生的呢?有人可能会说,随机数是由“随机种子”产生的。没错,随机种子是用来产生随机数的一个数,在计算机中,这样的一个“随机种子”是一个无符号整形数。那么随机种子是从哪里获得的呢?
  下面看这样一个C程序:
  //rand01.c
  #include
  static unsigned int RAND_SEED;
  unsigned int random(void)
  RAND_SEED=(RAND_SEED*123+59)%65536;
  return(RAND_SEED);
  void random_start(void)
  int temp[2];
  movedata(0xc,FP_SEG(temp),FP_OFF(temp),4);
  RAND_SEED=temp[0];
  main()
  unsigned int i,n;
  random_start();
  for(i=0;i&10;i++)
  printf("%u\t",random());
  printf("\n");
  这个程序(rand01.c)完整地阐述了随机数产生的过程:
  首先,主程序调用random_start()方法,random_start()方法中的这一句我很感兴趣:
  movedata(0xc,FP_SEG(temp),FP_OFF(temp),4);
  这个函数用来移动内存数据,其中FP_SEG(far pointer to segment)是取temp数组段地址的函数,FP_OFF(far pointer to offset)是取temp数组相对地址的函数,movedata函数的作用是把位于CH存储单元中的双字放到数组temp的声明的两个存储单元中。这样可以通过temp数组把CH处的一个16位的数送给RAND_SEED。
  random用来根据随机种子RAND_SEED的值计算得出随机数,其中这一句:
  RAND_SEED=(RAND_SEED*123+59)%65536;
  是用来计算随机数的方法,随机数的计算方法在不同的计算机中是不同的,即使在相同的计算机中安装的不同的操作系统中也是不同的。我在linux和windows下分别试过,相同的随机种子在这两种操作系统中生成的随机数是不同的,这说明它们的计算方法不同。
  现在,我们明白随机种子是从哪儿获得的,而且知道随机数是怎样通过随机种子计算出来的了。那么,随机种子为什么要在内存的CH处取?CH处存放的是什么?
  学过《计算机组成原理与接口技术》这门课的人可能会记得在编制ROM BIOS时钟中断服务程序时会用到Intel 8253定时/计数器,它与Intel 8259中断芯片的通信使得中断服务程序得以运转,主板每秒产生的18.2次中断正是处理器根据定时/记数器值控制中断芯片产生的。在我们计算机的主机板上都会有这样一个定时/记数器用来计算当前系统时间,每过一个时钟信号周期都会使记数器加一,而这个记数器的值存放在哪儿呢?没错,就在内存的 CH处,其实这一段内存空间是这样定义的:
  TIMER_LOW DW ? ;地址为 CH
  TIMER_HIGH DW ? ;地址为 EH
  TIMER_OFT DB ? ;地址为 H
  时钟中断服务程序中,每当TIMER_LOW转满时,此时,记数器也会转满,记数器的值归零,即TIMER_LOW处的16位二进制归零,而TIMER_HIGH加一。rand01.c中的
  movedata(0xc,FP_SEG(temp),FP_OFF(temp),4);
  正是把TIMER_LOW和TIMER_HIGH两个16位二进制数放进temp数组,再送往RAND_SEED,从而获得了“随机种子”。
上一个文章:
下一个文章:
网站版权与免责声明
①由于各方面情况的不断调整与变化,本网所提供的相关信息请以权威部门公布的正式信息为准.
②本网转载的文/图等稿件出于非商业性目的,如转载稿涉及版权等问题,请在两周内来电联系.
??????????????????
???????????????
| 【】【】【】【】【】 |
| 【】【】3686人阅读
C语言(5)
C语言中用于产生随机数的函数是rand(), 下面我用程序详细说明一下如何在C语言下产生随机数。
示例代码如下:
#include &stdio.h&
#include &string.h&
#include &stdlib.h&
int main(int argc, char **argv)
a = rand()%101;
printf(&a = %d\n&, a);
运行结果为:
$ ./a.out&
发现再运行时,不管运行多少次,都不会再次产生随机数。
将代码改成:
#include &stdio.h&
#include &string.h&
#include &stdlib.h&
int main(int argc, char **argv)
srand(12);
a = rand()%101;
printf(&a = %d\n&, a);
运行结果:
发现a的值相对上个程序改变了一次。
如果将 srand(12);
改为 srand(34);
运行结果:
我们发现只要srand(N);N的值改变,产生的随机数也会改变。
再将代码改为:
#include &stdio.h&
#include &string.h&
#include &stdlib.h&
int main(int argc, char **argv)
srand((unsigned int)time(NULL));
a = rand()%101;
printf(&a = %d\n&, a);
运行结果:
这就产生了不一样的随机数。
time函数是随时间一直增加的。
如何确定随机数的范围?
这个是取决于 程序
a = rand()%N;
其中,N表示整数,例如上例中,N为101,
则a的取值为0~100 。
如果想取值任意数之间,例如L~M,则N的取值为M-L+1,再加上L。具体如33~44之间的整数,
则应该为a = rand()%12 + 33;
示例代码:
#include &stdio.h&
#include &string.h&
#include &stdlib.h&
int main(int argc, char **argv)
int a[10];
srand((unsigned int)time(NULL));
for (i = 0; i & 10; i++)
a[i] = rand()%12 + 33;
printf(&a[%d] = %d\n&, i, a[i]);
运行结果:
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:13759次
排名:千里之外
原创:29篇
(3)(1)(1)(1)(1)(13)(4)(1)(3)(1)该问题被发起重新开启投票
投票剩余时间:
之前被关闭原因:
该问题被发起删除投票
投票剩余时间:
距离悬赏到期还有:
参与关闭投票者:
关闭原因:
该问题已经被锁定
锁定原因:()
保护原因:避免来自新用户不合宜或无意义的致谢、跟帖答案。
该问题已成功删除,仅对您可见,其他人不能够查看。
首先,高斯随机数有如下特征,均值为0,方差为1。这个相对于标准分布的随机数来说的, 简单的说他们之间的区别只是随机数在区间内产生的概率不同。具体要说那个 区域概率大,那个区域概率小,翻翻概率的教材吧,上面有标准分布的图像, 至于gauss的概率分布图像,我想网上也能找到,或者数学教材上。给你一个 Knuth首创并被大家认可的一个产生高斯随机数列的代码:
&stdlib.h&#include
&math.h& double
gaussrand() {
(double)rand()
(double)rand()
不是您所需,查看更多相关问题与答案
德问是一个专业的编程问答社区,请
后再提交答案
关注该问题的人
共被浏览 (5553) 次

我要回帖

更多关于 小米5x评测 的文章

 

随机推荐