当我读一些写随机数生成器的问题时,我看到了那个函数 高效,但它是用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;
}
}
答案 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()
函数的实现。