Для меня с обновлением до 4.3.1 я просто обрезаю таблицу EdmMetaData или просто удаляю ее прямо.
В Ruby:
a = (0..100).entries.sort_by {rand}.slice! 0, 5
Обновление: Вот немного отличающийся путь: = (0... 100) .entries.sort_by {рэнд} [0... 5]
Править:
и В Ruby 1.9 можно сделать это:
Array(0..100).sample(5)
Вот другая версия Python, более тесно соответствуя структуре Вашего кода C#. Нет встроенного для предоставления отличных результатов, таким образом, я добавил функцию, чтобы сделать это.
import itertools, random
def distinct(seq):
seen=set()
for item in seq:
if item not in seen:
seen.add(item)
yield item
def getRandomNumbers(max):
while 1:
yield random.randint(0,max)
for item in itertools.islice(distinct(getRandomNumbers(100)), 5):
print item
Я не могу действительно считать Ваш LINQ, но я думаю, что Вы пытаетесь получить 5 случайных чисел до 100 и затем удалить дубликаты.
Вот решение для этого:
def random(max)
(rand * max).to_i
end
# Get 5 random numbers between 0 and 100
a = (1..5).inject([]){|acc,i| acc << random( 100)}
# Remove Duplicates
a = a & a
Но возможно Вы на самом деле ищете 5 отличных случайных чисел между 0 и 100. В этом случае:
def random(max)
(rand * max).to_i
end
a = []
while( a.size < 5)
a << random( 100)
a = a & a
end
Теперь, этот мог бы нарушить Ваш смысл "не слишком много циклов", но по-видимому Взять, и Отличный просто скрывают цикличное выполнение от Вас. Было бы достаточно легко просто добавить методы к Счетному для сокрытия цикла с условием продолжения.
Возможно, это удовлетворит Вашим потребностям и посмотрит немного больше linqish:
from numpy import random,unique
def GetRandomNumbers(total=5):
while True:
yield unique(random.random(total*2))[:total]
randomGenerator = GetRandomNumbers()
myRandomNumbers = randomGenerator.next()
Вот транслитерация от Вашего решения до Python.
Во-первых, генератор, который создает Случайные числа. Это не очень Pythonic, но это - хорошее соответствие с Вашим примером кода.
>>> import random
>>> def getRandomNumbers( max ):
... while True:
... yield random.randrange(0,max)
Вот клиентский цикл, который собирает ряд 5 отличных значений. Это - снова - не большая часть реализации Pythonic.
>>> distinctSet= set()
>>> for r in getRandomNumbers( 100 ):
... distinctSet.add( r )
... if len(distinctSet) == 5:
... break
...
>>> distinctSet
set([81, 66, 28, 53, 46])
Не ясно, почему Вы хотите использовать генератор для случайных чисел - это - одна из нескольких вещей, это так просто, что генератор не упрощает его.
Больше версии Pythonic могло бы быть чем-то как:
distinctSet= set()
while len(distinctSet) != 5:
distinctSet.add( random.randrange(0,100) )
Если требования должны генерировать 5 значений и найти отличными среди тех 5, то что-то как
distinctSet= set( [random.randrange(0,100) for i in range(5) ] )
Ну, сначала Вы переписываете LINQ в Python. Затем Вашим решением является острота :)
from random import randrange
def Distinct(items):
set = {}
for i in items:
if not set.has_key(i):
yield i
set[i] = 1
def Take(num, items):
for i in items:
if num > 0:
yield i
num = num - 1
else:
break
def ToArray(items):
return [i for i in items]
def GetRandomNumbers(max):
while 1:
yield randrange(max)
print ToArray(Take(5, Distinct(GetRandomNumbers(100))))
При помещении всех простых методов выше в модуль под названием LINQ.py можно произвести друзей впечатление.
(Правовая оговорка: конечно, это на самом деле не переписывает LINQ в Python. У людей есть неправильное представление, что LINQ является просто набором тривиальных дополнительных методов и некоторого нового синтаксиса. Действительно усовершенствованная часть LINQ, однако, является автоматическим поколением SQL так, чтобы при запросах базы данных это была база данных, которая реализует Отличный (), а не сторона клиента.)
import random
def makeRand(n):
rand = random.Random()
while 1:
yield rand.randint(0,n)
yield rand.randint(0,n)
gen = makeRand(100)
terms = [ gen.next() for n in range(5) ]
print "raw list"
print terms
print "de-duped list"
print list(set(terms))
# produces output similar to this
#
# raw list
# [22, 11, 35, 55, 1]
# de-duped list
# [35, 11, 1, 22, 55]
Python с числовым Python:
from numpy import *
a = random.random_integers(0, 100, 5)
b = unique(a)
Voilà! Уверенный Вы могли сделать что-то подобное в стиле функционального программирования, но... почему?
Вот другое решение Ruby:
a = (1..5).collect { rand(100) }
a & a
Я думаю с Вашим оператором LINQ, Отличное удалит дубликаты после того, как 5 были уже взяты, таким образом, Вы, как гарантируют, не вернетесь 5. Кто-то может исправить меня, если я неправ, все же.
РЕДАКТИРОВАНИЕ: хорошо, только для забавы, более короткого и более быстрого одно (и все еще использование итераторов).
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]
Да, я знаю, остроты нужно оставить любителям жемчуга, но я думаю, что этот довольно мощен не так ли?
Старое сообщение здесь:
Мой бог, насколько сложный все это! Давайте будем pythonic:
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])
Приятного отдыха
РЕДАКТИРОВАНИЕ: Как комментаторы заметили, это - точный перевод кода вопроса.
Для предотвращения проблемы, мы добрались путем удаления дубликатов после генерации списка, приводящего к слишком небольшим данным, можно выбрать иначе:
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]
Я воздержусь от простых решений с помощью 'случайного' модуля, так как я беру его, это не действительно, что Вы после. Вот то, что я думаю, что Вы ищете в Python:
>>> import random
>>>
>>> def getUniqueRandomNumbers(num, highest):
... seen = set()
... while len(seen) < num:
... i = random.randrange(0, highest)
... if i not in seen:
... seen.add(i)
... yield i
...
>>>
Чтобы показать Вам, как это работает:
>>> list(getUniqueRandomNumbers(10, 100))
[81, 57, 98, 47, 93, 31, 29, 24, 97, 10]
Хм... Как насчет (Python):
s = set()
while len(s) <= N: s.update((random.random(),))
>>> import random
>>> print random.sample(xrange(100), 5)
[61, 54, 91, 72, 85]
Это должно привести к 5 уникальным значениям в диапазоне 0 — 99
. xrange
объект генерирует значения согласно просьбе, таким образом, никакая память не используется для значений, которые не выбираются.