我该如何将这个写成Ruby/Python?或者,你能把我的LINQ翻译成Ruby/Python吗?
昨天,我在这里问了一个问题,但没有得到我满意的答案。我真的想知道如何用像Ruby这样的函数式编程语言生成一个包含N个独特随机数字的列表,而不需要写得太复杂。
因为没有看到我喜欢的答案,我自己写了一个LINQ的解决方案:
static void Main(string[] args)
{
var temp = from q in GetRandomNumbers(100).Distinct().Take(5) select q;
}
private static IEnumerable GetRandomNumbers(int max)
{
Random r = new Random();
while (true)
{
yield return r.Next(max);
}
}
你能把我的LINQ代码翻译成Ruby吗?Python?或者其他函数式编程语言?
注意:请尽量不要使用太多的循环和条件判断——否则解决方案就太简单了。而且,我更希望看到一种方法,不需要生成一个比N大得多的数组,然后再去除重复项,最后缩减到N。
我知道我有点挑剔,但我真的想看到一些优雅的解决方案。谢谢!
编辑:
为什么会有这么多反对票?
最开始我的代码示例是把Distinct()放在Take()后面,正如很多人指出的那样,这样可能会让我得到一个空列表。我已经调整了这两个方法的调用顺序,以反映我最初的意思。
道歉:
有人告诉我这篇帖子看起来有点傲慢。我并不是想暗示LINQ比Ruby/Python更好;也不是说我的解决方案比其他人的好得多。我的目的是想学习如何在Ruby中做到这一点(在某些限制条件下)。如果我让人觉得不舒服,我很抱歉。
14 个回答
3
嗯……那用(Python)怎么样:
s = set()
while len(s) <= N: s.update((random.random(),))
13
>>> import random
>>> print random.sample(xrange(100), 5)
[61, 54, 91, 72, 85]
这段代码应该会在0到99的范围内产生5个独特的值。xrange
这个对象会根据需要生成值,所以对于那些没有被取样的值,不会占用内存。
5
在Ruby语言中:
a = (0..100).entries.sort_by {rand}.slice! 0, 5
更新:这里有一种稍微不同的方法: a = (0...100).entries.sort_by{rand}[0...5]
编辑:
在Ruby 1.9版本中,你可以这样做:
Array(0..100).sample(5)