srand函数应该放在main函数中 还是放在 调用rand()函数的子函数中呢?

C语言 码拜 9年前 (2015-05-11) 2346次浏览 0个评论
 

我做的是信道编码的仿真程序,结构如下:

main()
{
      … …
      srand( (unsigned int) time(NULL) );

      for(i=0; i<FRAME_NUM; i++)
      {
            encode(); // encode函数内部调用rand()产生随机二元信息序列
            modulation();
            channel(); // channel函数内部调用rand()产生随机信道噪声
            demodulation();
            decode();
            … …
     }
     … …
}

我的问题是:如果我在main()函数中调用srand()来初始化随机数种子,是不是只有在main()函数中调用rand()才能识别这个已设置的随机数种子,而在encode()、channel()这样的子函数中调用rand()就不能识别,必须在这些子函数中也写上srand()来设置随机数种子才可以? 

我对srand()、rand()的运行机理不了解,只能按照c语言的规则想问题,觉得给函数内部传一个参数(比如随机数种子) ,要么作为函数参数传递,要么就定义成全局变量才可以啊。

请大家不吝赐教 谢谢啦!

5分
里面也用得到,问题你只是在启动的时候srand了啊。如果性能允许,建议每次rand之前都srand一把
15分
楼上胡扯!

放在main函数开始的地方调且只调一次!

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 );
}
看到源码,似乎明白了些什么
谢谢zhao4zhong1 虽然还是有疑惑 但至少知道怎么用了
引用 3 楼 zhangxiangDavaid 的回复:

看到源码,似乎明白了些什么

知道看源码的重要性了吧。

提醒楼主:rand()函数返回值在0~32676之间!
如果需要扩大该范围,参考下面:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
unsigned long ulrand(void) {
    return (
     (((unsigned long)rand()<<24)&0xFF000000ul)
    |(((unsigned long)rand()<<12)&0x00FFF000ul)
    |(((unsigned long)rand()    )&0x00000FFFul));
}
unsigned __int64 ullrand(void) {
    return (
     (((unsigned __int64)ulrand())<<32)
    | ((unsigned __int64)ulrand()));
}
int i;
unsigned long ul;
unsigned __int64 ull;
void main() {
    srand(time(NULL));
    for (i=0;i<10;i++) {
        ul=ulrand();
        printf("%010lu 0x%08x\n",ul,ul);
    }
    for (i=0;i<10;i++) {
        ull=ullrand();
        printf("%020I64u 0x%016I64x\n",ull,ull);
    }
}
//3971076432 0xecb1d150
//2433428051 0x910b2a53
//1415415336 0x545d8628
//1312330759 0x4e389407
//1845758378 0x6e0409aa
//0008069933 0x007b232d
//4202720757 0xfa806df5
//2669855255 0x9f22c217
//0312068736 0x1299ca80
//2084555989 0x7c3fccd5
//03502077880857307931 0x3099e1472040ab1b
//16884702393146816355 0xea52835e19b43763
//01877364819396611730 0x1a0dbd5b45f34e92
//07839440151924835771 0x6ccb4948756a05bb
//09471412086917299176 0x8371371c820bfbe8
//04411255971577469925 0x3d37edef2f321be5
//13735846279546091130 0xbe9f876a65b7367a
//04512980766520059820 0x3ea15418aa9927ac
//15821377118299441610 0xdb90d2a9f1bb49ca
//15512417228822200185 0xd7472d480398bf79


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明srand函数应该放在main函数中 还是放在 调用rand()函数的子函数中呢?
喜欢 (1)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!