我们可以用c形式编写该函数吗?

时间:2010-06-26 11:31:25

标签: c# c random

当我读一些写随机数生成器的问题时,我看到了那个函数 高效,但它是用C#编写的。我希望以c的形式看到该功能 语言,有人可以帮忙吗?

IEnumerable<int> ForLargeQuantityAndRange(int quantity, int range)
{
    for (int n = 0; n < quantity; n++)
    {
        int r = Random(range);

        while (!used.Add(r))
            r = Random(range);

        yield return r;
    }
}

4 个答案:

答案 0 :(得分:2)

有关C的数字生成器的问题在此之前已经在SO上提出过,例如文章“Create Random Number Sequence with No Repeats”。

我建议查看上面的文章,看看是否有合适的东西,并为C中的标准rand()函数提供了一个有用的替代方案,假设你已经查看了后者并拒绝了它。

答案 1 :(得分:1)

这不是一个功能,如C或C ++中的功能。这是一个共同的例程,可以恢复。

要在C中实现它,您需要维护外部状态,并提供“下一个值”功能。

此功能的优点是它保证了唯一的值。你真的需要它吗?如果没有,请使用stdlib的rand乘以适当的因子。

答案 2 :(得分:0)

你只想要随机数吗?如果是这样,为什么不使用那些可以跨平台方式为您完成的众多库中的一个? Here是一个。

答案 3 :(得分:0)

要在C中编写协同例程,您需要维护状态。这种最简单的方法是使用static变量。对于此示例,它看起来像:

int ForLargeQuantityAndRange(int init_quantity, int init_range)
{
    static int n;
    static int quantity, range;

    if (init_quantity > 0)
    {
        n = 0;
        quantity = init_quantity;
        range = init_range;
    }

    if (n++ < quantity)
    {
        int r = Random(range);

        while (!used_add(r))
            r = Random(range);

        return r;
    }

    /* Quantity exceeded */
    return -1;
}

...您可以使用(quantity, range)将其称为初始化序列,然后(0, 0)继续之前的序列。

请注意,您必须提供Random()used_add()函数的实现。