关于C语言中随机数的问题
C语言中随机数rand和srand有什么区别,为什么每次用rand的时候都要先用srand设置一随机数种子,用time.h作种子到底原理是什么的?randmos这个函数究...
C语言中随机数rand和srand有什么区别,为什么每次用rand的时候都要先用srand设置一随机数种子,用time.h作种子到底原理是什么的?randmos这个函数究竟该怎么用阿?设置随机数种子的要求是什么?格式是什么样的?到底怎么用才会比较好?time.h这是个什么函数阿??为什么有的函数用随机数的时候前会加上 int randoms(int number); 而有的却没有呢??很苦恼啊??使用随机数时候有什么基本的使用方法,请多讲讲啊!!不好意思,一次问的有点多,请帮帮忙吧~~
非常感谢大家讲的这么详细啊`~~真不知道该给谁了~~~苦恼啊~~ 展开
非常感谢大家讲的这么详细啊`~~真不知道该给谁了~~~苦恼啊~~ 展开
5个回答
展开全部
理论上,随机数不是随机产生的,他是有规律的,比如srand(1)到srand(100000)里面,有100000个种子,就是说你有100000个数可以选择,我们称之为随机,其实
主要关键是种子srand的选择是不是接近随机(不存在完全随机),书上说最好用的是时间,因为时间的数值随时间变化而变化,运行两次,一般不会出现前一次和后一次相同的局面,所以看上去就有点像随机了。
比如
这里是c++,c的我忘记了。
#include <time.h>
int a[10],b;
srand(time(0));
for (b=0;b<10;b++)
a[b]=rand()%100;
上面说的是用时间来作为种子,一天内不会重复,精确到秒,第二天,如果你的软件一直开着,就是说有1/(60*60*24)个可能会重复。如果长期使用,平均每使用60*60*24次,有一个概率会重复,当你发现重复现象,那时你把软件关掉,再开启,好像就可以重新安排种子里面的数字了。当然,条件是你有足够的数可供选择,所以a[b]=rand()%100;中的100可以写成60*60*24。
我上一个完整的c++程序,你下载dev-c++,运行一个就会发现问题。c的我忘的一干二净,真的写不出来。
#include <iostream.h>
#include <stdio.h>
#include <time.h>
main()
{int a[10],b,c,d;
srand(time(0));
for (b=0;b<10;b++)
{
a[b]=rand()%100;
}
for (b=0;b<10;b++)
{d=0;
for (c=2;c<a[b];c++)
{if (a[b]%c==0) d=1;
}
if (d==0) cout<<a[b]<<endl;
}
}
另外time.h是时间函数,用#include<time.h>声明,用time(0)调用。
randmos这个函数,是在visul软件上使用的,意思是清空种子里的数,重新安排种子里的数。c和c++都没有使用,只有vb,vc上使用,我觉得还是很有用的,但是c和c++都没有库存这个函数,大概因为这些软件不是应用软件,只供学习。如果你要使用的话,只有自己编写了,嘿嘿。
这里还有个漏洞,就是time()时间只加不减的特性,就是说种子的分配是按每秒加3或5的方式递增的,我没找到解决办法,也不知道为什么。如果过几秒再看种子,有时是增加十几,时间越长,增加越多,不过好像没什么影响,看上去数值确实很像随机的。
主要关键是种子srand的选择是不是接近随机(不存在完全随机),书上说最好用的是时间,因为时间的数值随时间变化而变化,运行两次,一般不会出现前一次和后一次相同的局面,所以看上去就有点像随机了。
比如
这里是c++,c的我忘记了。
#include <time.h>
int a[10],b;
srand(time(0));
for (b=0;b<10;b++)
a[b]=rand()%100;
上面说的是用时间来作为种子,一天内不会重复,精确到秒,第二天,如果你的软件一直开着,就是说有1/(60*60*24)个可能会重复。如果长期使用,平均每使用60*60*24次,有一个概率会重复,当你发现重复现象,那时你把软件关掉,再开启,好像就可以重新安排种子里面的数字了。当然,条件是你有足够的数可供选择,所以a[b]=rand()%100;中的100可以写成60*60*24。
我上一个完整的c++程序,你下载dev-c++,运行一个就会发现问题。c的我忘的一干二净,真的写不出来。
#include <iostream.h>
#include <stdio.h>
#include <time.h>
main()
{int a[10],b,c,d;
srand(time(0));
for (b=0;b<10;b++)
{
a[b]=rand()%100;
}
for (b=0;b<10;b++)
{d=0;
for (c=2;c<a[b];c++)
{if (a[b]%c==0) d=1;
}
if (d==0) cout<<a[b]<<endl;
}
}
另外time.h是时间函数,用#include<time.h>声明,用time(0)调用。
randmos这个函数,是在visul软件上使用的,意思是清空种子里的数,重新安排种子里的数。c和c++都没有使用,只有vb,vc上使用,我觉得还是很有用的,但是c和c++都没有库存这个函数,大概因为这些软件不是应用软件,只供学习。如果你要使用的话,只有自己编写了,嘿嘿。
这里还有个漏洞,就是time()时间只加不减的特性,就是说种子的分配是按每秒加3或5的方式递增的,我没找到解决办法,也不知道为什么。如果过几秒再看种子,有时是增加十几,时间越长,增加越多,不过好像没什么影响,看上去数值确实很像随机的。
展开全部
如果你要一个0-100以内的数字,那么要让电脑在1-100里随机选一个数
那怎么选呢,这个选数的东西就是种子,常用系统时钟作为种子,因此会有你说的time.h
比如系统时钟是由一个计数器来控制的,时钟不断在计时,数字不断在变化,假设计数范围是0-65535
当你取一个随机数时,就得到当前计数器的值,不同时候取的值不一样,差不多相当于是随机取的,但因为和时间有关,说不定会有什么不易察觉的规律,
所以这个随机数不是真正随机的数,是伪随机数(从其它文章里看来的)
然后用它除65535再乘100就相当于在0-100里随机取个数了
我看了关于随机数的一些东西,理解是这样的啊,不知道对不对
那怎么选呢,这个选数的东西就是种子,常用系统时钟作为种子,因此会有你说的time.h
比如系统时钟是由一个计数器来控制的,时钟不断在计时,数字不断在变化,假设计数范围是0-65535
当你取一个随机数时,就得到当前计数器的值,不同时候取的值不一样,差不多相当于是随机取的,但因为和时间有关,说不定会有什么不易察觉的规律,
所以这个随机数不是真正随机的数,是伪随机数(从其它文章里看来的)
然后用它除65535再乘100就相当于在0-100里随机取个数了
我看了关于随机数的一些东西,理解是这样的啊,不知道对不对
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你试试不用srand看看
rand()生成的数虽然是一组随机数,但每次运行都会是同一组的,也就是每次运行程序结果都是一样的
为了保证每一次程序运行结果都是不同的随机数组,我们需要使程序每一次使用的种子都不一样,最简单的方法就是利用系统时间了
time(NULL)会返回一个表示当前系统时间的整数(或者是双字,我忘了),把这个数作为种子就能保证程序每次运行结果都不一样了
如果你能想出其它方法能保证每次程序运行结果都是不一样的方法更好,因为上面这种用法会导致程序有时间依赖性
rand()生成的数虽然是一组随机数,但每次运行都会是同一组的,也就是每次运行程序结果都是一样的
为了保证每一次程序运行结果都是不同的随机数组,我们需要使程序每一次使用的种子都不一样,最简单的方法就是利用系统时间了
time(NULL)会返回一个表示当前系统时间的整数(或者是双字,我忘了),把这个数作为种子就能保证程序每次运行结果都不一样了
如果你能想出其它方法能保证每次程序运行结果都是不一样的方法更好,因为上面这种用法会导致程序有时间依赖性
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
rand()是个伪随机数函数,它的原理是在一数(称为种子数)的基础上经过一系列的算法生成一个随机数的序列,默认种子数为0。
如果你只要用一次rand()函数,那好办,直接用,会生成一个随机数序列,满足你的要求,但如果程序里面要多次用就不行了,因为它始终默认种子数为0,种子数一样的话,生成的随机数序列就是一样的,这样的话就不“随机”了。
解决的办法就是,自己来设一个种子数,不同的种子数,生成的序列就是不同的了。srand()来设置种子数的。
要保证种子数不同,那用什么来设置种子数最好呢?最好的当然是系统时间,因为你只要不在同一秒使用多次srand()函数,种子数就是不一样的,生成的随机数序列就不一样,因此就要用到time()函数。
time.h不是函数,而是一个头文件,包含了time()函数的头文件。time()函数求出来的是自1970年1月1日到现在的秒数,在不同的时间取这个数作为种子数,就能保证生成的随机数序列不同。
如果你只要用一次rand()函数,那好办,直接用,会生成一个随机数序列,满足你的要求,但如果程序里面要多次用就不行了,因为它始终默认种子数为0,种子数一样的话,生成的随机数序列就是一样的,这样的话就不“随机”了。
解决的办法就是,自己来设一个种子数,不同的种子数,生成的序列就是不同的了。srand()来设置种子数的。
要保证种子数不同,那用什么来设置种子数最好呢?最好的当然是系统时间,因为你只要不在同一秒使用多次srand()函数,种子数就是不一样的,生成的随机数序列就不一样,因此就要用到time()函数。
time.h不是函数,而是一个头文件,包含了time()函数的头文件。time()函数求出来的是自1970年1月1日到现在的秒数,在不同的时间取这个数作为种子数,就能保证生成的随机数序列不同。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
内不决baidu,外不决google
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询