首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我如何用Ruby / Python编写这个?或者,你能将我的LINQ翻译成Ruby / Python吗?

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

Stack Overflow用户
提问于 2018-09-10 01:05:20
回答 2查看 0关注 0票数 0

昨天,我问了这个问题,从来没有得到一个我真的很满意的答案。我真的想知道如何使用诸如Ruby之类的函数语言生成N个唯一随机数的列表,而不必非常必要。

由于我没有看到任何我真正喜欢的东西,我已经在LINQ中编写了我想要的解决方案:

代码语言:javascript
复制

       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吗?蟒蛇?任何其他函数式编程语言?

注意:请尽量不要使用太多的循环和条件 - 否则解决方案是微不足道的。此外,我宁愿看到一个解决方案,你不必生成比N大得多的数组,这样你就可以删除重复项并将其修剪为N.

我知道我很挑剔,但我真的很想看到这个问题的优雅解决方案。谢谢!

编辑: 为什么所有的downvotes?

最初我的代码示例在Take()之后有Distinct(),正如许多人所指出的那样,它可能会留下一个空列表。我已经改变了调用这些方法的顺序,以反映我的意思。

道歉: 我被告知这篇文章是相当势利的。我并不是想暗示LINQ比Ruby / Python更好; 或者我的解决方案比其他人的解决方案要好得多。我的目的只是学习如何在Ruby中执行此操作(具有某些约束)。如果我是一个混蛋,我很抱歉。

EN

回答 2

Stack Overflow用户

发布于 2018-09-10 09:46:01

编辑:好的,只是为了好玩,一个更短,更快(仍然使用迭代器)。

代码语言:javascript
复制
def getRandomNumbers(max, size) :
    pool = set()
    return ((lambda x :  pool.add(x) or x)(random.randrange(max)) for x in xrange(size) if len(a) < size)

print [x for x in gen(100, 5)]
[0, 10, 19, 51, 18]

是的,我知道,单行应该留给perl爱好者,但我认为这个非常强大不是吗?

老留言:

我的天啊,这一切有多复杂!让我们做pythonic:

代码语言:javascript
复制
import random
def getRandomNumber(max, size, min=0) :
   # using () and xrange = using iterators
   return (random.randrange(min, max) for x in xrange(size))

print set(getRandomNumber(100, 5)) # set() removes duplicates
set([88, 99, 29, 70, 23])

请享用

编辑:评论员注意到,这是问题代码的精确翻译。

为了避免在生成列表后删除重复项而导致的问题,导致数据太少,您可以选择其他方式:

代码语言:javascript
复制
def getRandomNumbers(max, size) :
    pool = []
    while len(pool) < size :
        tmp = random.randrange(max)
        if tmp not in pool :
            yield pool.append(tmp) or tmp

print [x for x in getRandomNumbers(5, 5)]
[2, 1, 0, 3, 4]
票数 0
EN

Stack Overflow用户

发布于 2018-09-10 10:22:27

嗯......怎么样(Python):

代码语言:javascript
复制
s = set()
while len(s) <= N: s.update((random.random(),))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100000741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档