【问题标题】:Problem with getting multiple random numbers [duplicate]获取多个随机数的问题[重复]
【发布时间】:2011-09-10 12:08:54
【问题描述】:

可能重复:
Recommended way to initialize srand?

我正在从 AVI 中提取帧。我希望用户选择他是想从用户给定的范围内获取所有帧还是获取所有可用的帧或获取用户给定的随机帧数。前两个功能工作得很好。但是对于随机帧,我总是只得到一帧,而不是给定的帧数。所以,这里用户设置帧数:

case AVIINF_BUTTON_GETRAND:
            extractmode=-1;
            GetDlgItemText(aviinfhwnd, AVIINF_EDIT_GETRAND, charfrQuantity, 20);
            frQuantity = atoi(charfrQuantity);
            ExtractAVIFrames(extractmode, frFrom, frTo, frQuantity);
            EndDialog(aviinfhwnd, IDCANCEL);
break;

然后在所有初始化之后在 ExtractAVIFrames() 中,我这样做:

case -1://get x random frames

            for (int i=1; i<=frQuantity; i++)
            {
                index= GetRandomInt(iNumFrames);
                BYTE* pDIB = (BYTE*) AVIStreamGetFrame(pFrame, index);
                CreateFromPackedDIBPointer(pDIB, index);
            }
break;

调用GetRandomInt()

int GetRandomInt(int randNumScale)
{
    srand((unsigned)time(0));
    int random_integer;
    int range=randNumScale;
    random_integer = (rand()%range)+1;
    return random_integer;
}

所以,这应该调用 GetRandomInt() 函数 frQuantity-times,我应该有 frQuantity BMP,对吧?但我没有,我总是只得到一个(随机一个)。似乎在每次调用后 GetRandomInt 返回与上一次调用相同的数字。 怎么了? 谢谢

【问题讨论】:

  • 之前问过很多次。 srand() 应该 ONLY 被称为 ONCE。将其作为 main() 中的第一条语句。

标签: c++ winapi random


【解决方案1】:

您正在使用相同的种子初始化 pseudorandom 数字生成器。只需初始化一次,并使用半随机数(例如,系统时钟中的毫秒数)。

【讨论】:

  • 为什么不直接用 time(NULL) 来初始化呢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-11
  • 2018-07-21
  • 2014-06-14
  • 2021-09-27
  • 1970-01-01
相关资源
最近更新 更多