我该如何将这个写成Ruby/Python?或者,你能把我的LINQ翻译成Ruby/Python吗?

8 投票
14 回答
924 浏览
提问于 2025-04-11 09:21

昨天,我在这里问了一个问题,但没有得到我满意的答案。我真的想知道如何用像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) 

撰写回答