【问题标题】:Using rand() and srand(time(NULL)) right after doesn't generate a new random number [duplicate]之后使用 rand() 和 srand(time(NULL)) 不会生成新的随机数 [重复]
【发布时间】:2016-03-10 14:52:42
【问题描述】:
for (x = 1; x < 10; x++)
{
    (armoPtr + x) ->def = rand() % b + a;
    if ((armoPtr + x) -> def > b)
        (armoPtr + x) -> def = b;

    srand(time(NULL));

    (armoPtr + x) -> hp = rand() % 5 + 1;
    srand(time(NULL));

    (armoPtr + x) -> valOItem = rand() % (lvlpnts + 1) + max(lvlpnts);
    if ((armoPtr + x) -> valOItem > (lvlpnts + 1))
        (armoPtr + x) -> valOItem = (lvlpnts + 1);
    (armoPtr + x) -> valOItem *= 10;
    srand(time(NULL));
}

如果这是一个非常平庸的错误,请原谅我,但是这个循环不应该在每次循环时都有新的随机数吗?我还在 Com Sci 第一年的第二个学期。对不起,如果我很烂。哈哈哈

【问题讨论】:

  • time(NULL) 返回的值在循环迭代之间不会改变,因此您每次都将随机数生成器重置为相同的起始值。跨度>

标签: c loops random srand


【解决方案1】:

在开始绘制随机数之前调用 srand 一次

srand(time(NULL));
for (x = 1; x < 10; x++)
{

然后在循环内调用 top rand():

srand(time(NULL));
for (x = 1; x < 10; x++)
{
    (armoPtr + x) ->def = rand() % b + a;
    if ((armoPtr + x) -> def > b)
        (armoPtr + x) -> def = b;

    (armoPtr + x) -> hp = rand() % 5 + 1;

    (armoPtr + x) -> valOItem = rand() % (lvlpnts + 1) + max(lvlpnts);
    if ((armoPtr + x) -> valOItem > (lvlpnts + 1))
        (armoPtr + x) -> valOItem = (lvlpnts + 1);
    (armoPtr + x) -> valOItem *= 10;
}

在同一秒内多次使用 time(NULL) 喂 srand 将使您从头开始绘制相同的数字,因为 time(NULL) 粒度是秒。

【讨论】:

    猜你喜欢
    • 2020-07-13
    • 2011-06-11
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多