因此,我在Python中建立了一个列表,例如,让我们说前100个整数,但是我确实需要所有100个整数,但只有一个样本可以说3.
import random
def f():
list_ = []
for i in range(100):
list_.append(i)
return list_
def g(list_,k):
return random.sample(list_, k)
print(g(f(),3))
>>>[50, 92, 6]
现在我可以避免不首先构建整个列表,而是直接构建示例,也许是通过增加将元素添加到f()中的列表的概率来进行构建
因为如果我要建立一个庞大的列表,该列表不是整数,而是一些其他对象,那么这种方法在内存和计算方面可能会很昂贵.
解决方法:
def random_no_dups_k_of_n(k, n):
res = list(range(k))
for i in range(k, n):
v = random.randint(0, i) # this is 0-i inclusive
if v == i:
ir = random.randint(0,k-1)
res[ir] = i
return res
这里发生的事情:这是一种伸缩产品.从0到k-1的每个元素开始都有k / k的机会被选中.第一次迭代后,k有1 /(k 1)个被选择的机会,而所有其他(不仅是剩余的,而是所有)具有(k-1)/ k * k /(k 1)=(k-1)/ (k 1)被选中的机会.第2次迭代后,k 1的被选择机会为(/ k 2),而其他所有的都具有(k-1)/(k 1)*(k 1)/(k 2)=(k-1 )/(k 2)被选中的机会.等等.最后,每个数字都有k / n的机会被选中.
实际上,我只是看到您可以执行random.sample(range(n),k).我只是以为它不可用.
编辑:我得到了上面颠倒的概率.正确的版本应为:
def random_no_dups_k_of_n(k, n):
res = list(range(k))
for i in range(k, n):
v = random.randint(0, i) # this is 0-i inclusive
if v < k:
ir = random.randint(0,k-1)
res[ir] = i
return res
从0到k-1的每个元素开始都有k / k的机会被选中.第一次迭代后,k有k /(k 1)个被选择的机会,而所有其他(不仅是剩余的,而是所有)具有ak / k *((k-1)/ k * k /(k 1)1(k 1)= k /(k 1)被选中的机会.经过第二次迭代,k 1有ak /(k 2)被选中的机会,而其他所有元素都有ak /(k 1)*((k-1) / k * k /(k 2)2 /(k 2))= k /(k 2)被选中的机会.
实际上,这确实会使所有计算崩溃,从而在第m步之后为每个元素提供k /(k m)机会.
标签:python-3-x,list,random,arrays,python
来源: https://codeday.me/bug/20191111/2020231.html