请教rand()函数遇到的小问题

u013163178 2014-06-22 02:44:45
#include <stdlib.h>
#include <stdio.h>
#include <time.h> /*用到了time函数,所以要有这个头文件*/
#define MAX 10

int main( void)
{
int number[MAX] = {0};
int i;

for(i = 0; i < MAX; i++)
{
srand((unsigned) time(NULL)); /*播种子*/
number[i] = rand() % 100; /*产生100以内的随机整数*/
printf("%d ", number[i]);
}
printf("\n");
return 0;
}

这个函数打印出来的随机值都是同一个值,不知道为什么。于是我就调试,发现调试的时候,rand()函数返回值并不是同一个数。有人对我说time()的返回值的单位是秒,如果我的程序在1s内结束,那么设置的就是同一个种子。可是我把srand((unsigned) time(NULL)); 这一句搬到循环外面就对了,可这时候所有rand()函数的种子不都是一样的吗。为什么随机值却不一眼了呢。
然后又我写了个程序
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
/************************************************/
/*随机获取[M , N]区间内的浮点数 */
double RandomFloate(int M, int N)
{
int RandomValue1;
double RandomValue2;
time_t t;
srand((unsigned)time(&t));
RandomValue1 = M + rand() % (M - N + 1);
RandomValue2 = rand() / (RAND_MAX + 1);
return RandomValue1 + RandomValue2;
}
/************************************************/
int main()
{
int i;
for(i= 0;i<100; i++)
{
printf("%f\t",RandomFloate(2,5));
}
}

这回没有循环,可是随机值还是一样的,我就搞不懂了,谁能解释一下吗?
...全文
342 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-06-23
  • 打赏
  • 举报
回复
C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\RAND.C
/***
*rand.c - random number generator
*
*       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
*       defines rand(), srand() - random number generator
*
*******************************************************************************/

#include <cruntime.h>
#include <mtdll.h>
#include <stddef.h>
#include <stdlib.h>

#ifndef _MT
static long holdrand = 1L;
#endif  /* _MT */

/***
*void srand(seed) - seed the random number generator
*
*Purpose:
*       Seeds the random number generator with the int given.  Adapted from the
*       BASIC random number generator.
*
*Entry:
*       unsigned seed - seed to seed rand # generator with
*
*Exit:
*       None.
*
*Exceptions:
*
*******************************************************************************/

void __cdecl srand (
        unsigned int seed
        )
{
#ifdef _MT

        _getptd()->_holdrand = (unsigned long)seed;

#else  /* _MT */
        holdrand = (long)seed;
#endif  /* _MT */
}


/***
*int rand() - returns a random number
*
*Purpose:
*       returns a pseudo-random number 0 through 32767.
*
*Entry:
*       None.
*
*Exit:
*       Returns a pseudo-random number 0 through 32767.
*
*Exceptions:
*
*******************************************************************************/

int __cdecl rand (
        void
        )
{
#ifdef _MT

        _ptiddata ptd = _getptd();

        return( ((ptd->_holdrand = ptd->_holdrand * 214013L
            + 2531011L) >> 16) & 0x7fff );

#else  /* _MT */
        return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
#endif  /* _MT */
}
modyaj 2014-06-23
  • 打赏
  • 举报
回复
引用 4 楼 u013163178 的回复:
[quote=引用 2 楼 modyaj 的回复:] 随机数种子只设置一次 剩下的就系统自己处理 第二个程序 和第一个比起来 没什么实质的改变 同样的是每个随机数之前都设置了一次种子 你在第一个程序中 每次生成随机数后看看 sleep(1000)看看 结果会不会相同
第二个只是设置了一次啊,还能怎么改啊,难道到了把srand()放在mian()函数里面吗[/quote] for循环里每次调用 RandomFloate 都会设置一次的 解释上面的说得已经很清楚了 我觉得够了
鼻涕虫de皮皮 2014-06-23
  • 打赏
  • 举报
回复
马克,学习一下,积分快不够提问题列。。。。
「已注销」 2014-06-23
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\RAND.C
/***
*rand.c - random number generator
*
*       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
*       defines rand(), srand() - random number generator
*
*******************************************************************************/

#include <cruntime.h>
#include <mtdll.h>
#include <stddef.h>
#include <stdlib.h>

#ifndef _MT
static long holdrand = 1L;
#endif  /* _MT */

/***
*void srand(seed) - seed the random number generator
*
*Purpose:
*       Seeds the random number generator with the int given.  Adapted from the
*       BASIC random number generator.
*
*Entry:
*       unsigned seed - seed to seed rand # generator with
*
*Exit:
*       None.
*
*Exceptions:
*
*******************************************************************************/

void __cdecl srand (
        unsigned int seed
        )
{
#ifdef _MT

        _getptd()->_holdrand = (unsigned long)seed;

#else  /* _MT */
        holdrand = (long)seed;
#endif  /* _MT */
}


/***
*int rand() - returns a random number
*
*Purpose:
*       returns a pseudo-random number 0 through 32767.
*
*Entry:
*       None.
*
*Exit:
*       Returns a pseudo-random number 0 through 32767.
*
*Exceptions:
*
*******************************************************************************/

int __cdecl rand (
        void
        )
{
#ifdef _MT

        _ptiddata ptd = _getptd();

        return( ((ptd->_holdrand = ptd->_holdrand * 214013L
            + 2531011L) >> 16) & 0x7fff );

#else  /* _MT */
        return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
#endif  /* _MT */
}
第一次看你的这个代码,不知道啥意思,后来谁午觉是突然得到了启发,哈哈,谢谢诶 我已经搞定了
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

/*随机获取[M , N]区间内的浮点数 */
int  j =0;
double RandomFloate(int M, int N)
{

/***************************************************/
	if(j ==0)   //确保仅设置seed一次               
	{
	
		time_t t;
		srand((unsigned)time(&t));
	}
	j = 1;
/****************************************************/


	int RandomValue1;
	double RandomValue2;

	RandomValue1 = M + (int)(rand() % (M - N + 1));
	RandomValue2 = rand() / (double)(RAND_MAX + 1);
	return RandomValue1 + RandomValue2;
}
/***************************************************/

int main()
{
	int i;
    for(i= 0;i<1000; i++)
        {
           printf("%f\t",RandomFloate(29,518));

        }
	return 0;
}
「已注销」 2014-06-23
  • 打赏
  • 举报
回复
引用 11 楼 modyaj 的回复:
[quote=引用 4 楼 u013163178 的回复:] [quote=引用 2 楼 modyaj 的回复:] 随机数种子只设置一次 剩下的就系统自己处理 第二个程序 和第一个比起来 没什么实质的改变 同样的是每个随机数之前都设置了一次种子 你在第一个程序中 每次生成随机数后看看 sleep(1000)看看 结果会不会相同
第二个只是设置了一次啊,还能怎么改啊,难道到了把srand()放在mian()函数里面吗[/quote] for循环里每次调用 RandomFloate 都会设置一次的 解释上面的说得已经很清楚了 我觉得够了[/quote] 非常感谢你的热心回答,我知道了怎么办了
乐观的柏小柏 2014-06-22
  • 打赏
  • 举报
回复
虽然没研究过,平时只是用,但是看完楼上的这些回复,对这个函数有一定了解了
www_adintr_com 2014-06-22
  • 打赏
  • 举报
回复
计算机里面是没有真正的随机数的,这些库产生都是伪随机数列,同一个种子值进去,产生是一串相同的数列,数列中数的分布情况是衡量这个随机数函数好坏的主要标准
Intel0011 2014-06-22
  • 打赏
  • 举报
回复
引用 3 楼 u013163178 的回复:
[quote=引用 1 楼 czarten 的回复:] 随机数种子在一开始设定一次就可以 不是每次取随机数前都设一次种子
只设置一次的话,下次的种子岂不是和上一次一样的,那么随机值岂不是一样了[/quote] rand内部会更新随机种子的 正如czarten所说,每次都重新设置种子的话,由于时间间隔太近,【电脑循环计算速度太快了导致】得到相同的种子,也就对应相同的随机数队列
707wk 2014-06-22
  • 打赏
  • 举报
回复
你要看time返回的是不是同一个值
你怎么了熊吉 2014-06-22
  • 打赏
  • 举报
回复
引用 3 楼 u013163178 的回复:
[quote=引用 1 楼 czarten 的回复:] 随机数种子在一开始设定一次就可以 不是每次取随机数前都设一次种子
只设置一次的话,下次的种子岂不是和上一次一样的,那么随机值岂不是一样了[/quote] 随机数种子并不是确定一个随机数,而是确定一个随机数队列 所以你设好一个种子,就有了一整列的随机数等着你来取,你一个一个往下取就是了 反而你每次都重新设置种子的话,由于时间间隔太近,得到相同的种子,也就对应相同的随机数队列,这样你每次取随机数都取的是这个队列的第一个数,结果当然就是相同的了
「已注销」 2014-06-22
  • 打赏
  • 举报
回复
引用 2 楼 modyaj 的回复:
随机数种子只设置一次 剩下的就系统自己处理 第二个程序 和第一个比起来 没什么实质的改变 同样的是每个随机数之前都设置了一次种子 你在第一个程序中 每次生成随机数后看看 sleep(1000)看看 结果会不会相同
第二个只是设置了一次啊,还能怎么改啊,难道到了把srand()放在mian()函数里面吗
「已注销」 2014-06-22
  • 打赏
  • 举报
回复
引用 1 楼 czarten 的回复:
随机数种子在一开始设定一次就可以 不是每次取随机数前都设一次种子
只设置一次的话,下次的种子岂不是和上一次一样的,那么随机值岂不是一样了
modyaj 2014-06-22
  • 打赏
  • 举报
回复
随机数种子只设置一次 剩下的就系统自己处理 第二个程序 和第一个比起来 没什么实质的改变 同样的是每个随机数之前都设置了一次种子 你在第一个程序中 每次生成随机数后看看 sleep(1000)看看 结果会不会相同
你怎么了熊吉 2014-06-22
  • 打赏
  • 举报
回复
随机数种子在一开始设定一次就可以 不是每次取随机数前都设一次种子

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧