roo*_*kie 5 python random list
假设我们想要一个具有完全实例的n
0
/ 1
元素列表.有没有一行理解或更多pythonic方式来做到这一点比以下?k
1
def random_include(n, k):
ret = []
to_include = set(random.sample([i for i in range(n)], k))
for i in range(n):
if i in to_include:
ret.append(1)
ret.append(0)
Run Code Online (Sandbox Code Playgroud)
这是一个单线解决方案.
output = sorted([1] * k + [0] * (n - k), key=lambda k: random.random())
Run Code Online (Sandbox Code Playgroud)
使用random.shuffle
(文档):
random_list = [False] * j + [True] * k
random.shuffle(random_list)
Run Code Online (Sandbox Code Playgroud)
会给你一个随机j
时间False
和k
时间的列表True
.
请注意,实现自定义shuffle算法通常是有问题的,因为编写一个产生看似随机结果的算法非常容易,但不提供恒定的概率分布.即某些序列比其他序列更可能!
这在Jeff Atwood关于这个主题的博客文章中得到了广泛的探索.正确的解决方案,如果你想要一个正确的混乱序列是使用Fisher-Yates算法,这正是random.shuffle()
需要注意的事情:
def shuffle(self, x, random=None, int=int):
randbelow = self._randbelow
for i in reversed(range(1, len(x))):
# pick an element in x[:i+1] with which to exchange x[i]
j = randbelow(i+1) if random is None else int(random() * (i+1))
x[i], x[j] = x[j], x[i]
Run Code Online (Sandbox Code Playgroud)
因此,最好依靠random.shuffle()
而不是想出一个聪明的方法来自己洗牌!