一 如何产生不可预见的随机序列呢
利用 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() 的输出结果。
通过上面也可以延伸想到,我们可以得到任意区间的随机数,只需要对区间范围求模就可以转换得到,例如:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main( )
{
int i;
srand((unsigned)time( NULL ) );
for(i = 0; i < 10;i++)
printf("%d\n", rand()%100+1);
}
通过上面的代码我们可以得到1到100之间的随机数,其中srand((unsigned)time( NULL ) )是以时间为种子,时间是每一时刻都不相同的,因此得到不同随机数。
二 如何产生不重复的随机数
此处的一个想法在之前位图的博客中有提及,就是把数据i放置在数组中a[i]中,为了使顺序随机,我们在对随机选中的两个元素置换位置。
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
swap(int *pm,int *pn) /* 必须用指针进行交换 */
{
int temp;
temp=*pm;
*pm=*pn;
*pn=temp;
}
int main(void)
{
int i,a[513];
/*int *pa,*pb;*/
srand((unsigned)time( NULL ) ); /* 定义这个可以产生不同的随机数 */
for(i=1; i<=512; i++){a[i]=i;printf("%4d",a[i]);}
for(i=512; i>=1; i--)
swap(&a[i], &a[rand()%i+1]); /* 加一是从一到 i 的随机,就不会包含 0*/
printf("\n") ;
for(i=1; i<=64; i++)
printf("%4d",a[i] );
getch(); /*wintc 的输出 */
}