关于 rand()函数与 stand()函数的一些问题

lordage 2015-11-27 01:10:00
小白一枚,想请各位大神帮帮忙
学 c 的时候学到了 rand()和 srand()函数,有以下两个问题:
1.生成 rand() 随机数为什么只要一个 srand 就可以了?srand()是同时生成多个 seed 吗?多调用同样可以生成多个随机数,那么这两种情况有什么区别?

2.以下题目是计算投掷两个骰子,点数相加,各个情况出现的频率,为什么 srand()放到 for 里头就只会生成一种随机数?(只会出现一种和)而放到外头就可以正常分配(即不会出现一个数字出现36000次)

希望大神能够解答

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE_FREQ 13
int main(int argc, const char * argv[]) {

int n;
int first_dice;
int second_dice;
int sum;
int freq[SIZE_FREQ] = {0};

srand(time(NULL));


for (n = 1; n <= 36000; n++) {


first_dice = (rand() % 6) + 1;
second_dice = (rand() % 6) + 1;

sum = first_dice + second_dice;
++freq[sum];

}


for (n = 2; n <= 12; n++) {
printf("the %d is :%d\n",n,freq[n]);
}

return 0;
}



...全文
750 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
码无痕 2015-12-07
  • 打赏
  • 举报
回复
srand(time(NULL)) 在for循环中,由于速度非常快,那么time(NULL)这个值很有可能是同一个数值(for循环在同一秒内执行完毕),此时你初始化随机队列的时候就是相同的队列(因为种子是同一个数值),此时你去rand()那么取得就是该队列第一个值,而你不停的初始化,那么得到的一直是这个队列的第一个值,所以rand()出来的值是相同的
lm_whales 2015-12-07
  • 打赏
  • 举报
回复
可以把
引用 9 楼 zhao4zhong1 的回复:
Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\rand.c
/***
*rand.c - random number generator
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       defines rand(), srand() - random number generator
*
*******************************************************************************/

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

/***
*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
        )
{
        _getptd()->_holdrand = (unsigned long)seed;
}


/***
*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
        )
{
        _ptiddata ptd = _getptd();

        return( ((ptd->_holdrand = ptd->_holdrand * 214013L
            + 2531011L) >> 16) & 0x7fff );
}
可以把这个随机数生成器库函数,改造成随机数类
lm_whales 2015-12-07
  • 打赏
  • 举报
回复
程序没有办法生成真正的随机数 一般来说,随机数产生的方式,是用 伪随机序列生成器产生的。 伪随机序列生成器,生成的数据,可以遍历某个范围的所有数,所以总体看来是随机的。 由于种子相同,会产生相同的随机序列,所以随机数生成器需要初始化 以便有一定的随机性。 多次初始化 是不必要的,至少对于库函数来说是不必要的。
赵4老师 2015-11-27
  • 打赏
  • 举报
回复
Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\rand.c
/***
*rand.c - random number generator
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       defines rand(), srand() - random number generator
*
*******************************************************************************/

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

/***
*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
        )
{
        _getptd()->_holdrand = (unsigned long)seed;
}


/***
*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
        )
{
        _ptiddata ptd = _getptd();

        return( ((ptd->_holdrand = ptd->_holdrand * 214013L
            + 2531011L) >> 16) & 0x7fff );
}
paschen 2015-11-27
  • 打赏
  • 举报
回复
引用 7 楼 lordageluo 的回复:
[quote=引用 5 楼 paschen 的回复:] [quote=引用 2 楼 lordageluo 的回复:] [quote=引用 1 楼 paschen 的回复:] srand 初始种子,不然你每次生成的随机数其实是一样的 其实生成的只是伪随机数,srand(time(NULL));就根据time返回的值作为种子,来保证每次生成的随机数不是同一组
等于说我调用两次 srand()函数只是再一次生成了一个 seed 是嘛?那 for 呢?为什么我重复循环调用 srand()函数没法生成不同的 seed?[/quote] srand 不是用来生成随机数,只是做初始化[/quote] 不是里头……是外头……[/quote] 没懂你意思 如果srand后参数是一样的,每次调用rand函数生成的伪随机数序列都是一样的
lordage 2015-11-27
  • 打赏
  • 举报
回复
引用 5 楼 paschen 的回复:
[quote=引用 2 楼 lordageluo 的回复:] [quote=引用 1 楼 paschen 的回复:] srand 初始种子,不然你每次生成的随机数其实是一样的 其实生成的只是伪随机数,srand(time(NULL));就根据time返回的值作为种子,来保证每次生成的随机数不是同一组
等于说我调用两次 srand()函数只是再一次生成了一个 seed 是嘛?那 for 呢?为什么我重复循环调用 srand()函数没法生成不同的 seed?[/quote] srand 不是用来生成随机数,只是做初始化[/quote] 不是里头……是外头……
paschen 2015-11-27
  • 打赏
  • 举报
回复
引用 2 楼 lordageluo 的回复:
[quote=引用 1 楼 paschen 的回复:] srand 初始种子,不然你每次生成的随机数其实是一样的 其实生成的只是伪随机数,srand(time(NULL));就根据time返回的值作为种子,来保证每次生成的随机数不是同一组
等于说我调用两次 srand()函数只是再一次生成了一个 seed 是嘛?那 for 呢?为什么我重复循环调用 srand()函数没法生成不同的 seed?[/quote] srand 不是用来生成随机数,只是做初始化
lordage 2015-11-27
  • 打赏
  • 举报
回复
引用 4 楼 paschen 的回复:
问题2,通常只用设置一次就可以了 你放去循环里,time(NULL)所取得的时间只能精确到秒,而循环所花费的时间显然远远低于这个数量级
我大致明白了……但是放到 for 外头不是只能运行一次函数吗……在 for 循环里头多次使用 rand()反而不会出现一种情况出现36000次……这一点很费解……
lordage 2015-11-27
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
srand 初始种子,不然你每次生成的随机数其实是一样的 其实生成的只是伪随机数,srand(time(NULL));就根据time返回的值作为种子,来保证每次生成的随机数不是同一组
等于说我调用两次 srand()函数只是再一次生成了一个 seed 是嘛?那 for 呢?为什么我重复循环调用 srand()函数没法生成不同的 seed?
paschen 2015-11-27
  • 打赏
  • 举报
回复
问题2,通常只用设置一次就可以了 你放去循环里,time(NULL)所取得的时间只能精确到秒,而循环所花费的时间显然远远低于这个数量级
lordage 2015-11-27
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
srand 初始种子,不然你每次生成的随机数其实是一样的 其实生成的只是伪随机数,srand(time(NULL));就根据time返回的值作为种子,来保证每次生成的随机数不是同一组
就是放到 for 里头
paschen 2015-11-27
  • 打赏
  • 举报
回复
srand 初始种子,不然你每次生成的随机数其实是一样的 其实生成的只是伪随机数,srand(time(NULL));就根据time返回的值作为种子,来保证每次生成的随机数不是同一组

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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