随机数问题(srand(),rand())

一 如何产生不可预见的随机序列呢

利用 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 的输出 */
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值