population = range(1, 50) # list of numbers from 1 to 49
sample = []
until we get 6 samples:
index = a random number from 0 to 48 # look up random.randint()
if population[index] is not 0: # if we found an unmarked value
append population[index] to sample
set population[index] = 0 # mark selected
这是一个非常常见且愚蠢的面试问题,下面是它的解决方案/算法:
对于关心效率的人来说,这里是我的解决方案和Chin's的测试台:
结果是:
决心在同一时间!
set
不会保留任何重复项:您可以使用^{} :
假设这是一个赋值,并且您需要自己实现采样,那么您可以take a look at how ^{} is implemented 。它确实很有用,但是对于您的需要来说可能太复杂了,因为代码还确保了所有子切片也是有效的随机样本。为了提高效率,它还根据人口规模采用不同的方法。
至于工作表,我认为它假定您从1到49的数字列表开始,并建议您用0替换您选择的数字,以便在重新选择时可以跳过。这里有一些伪代码让您开始:
如果你想尝试一些不同的方法,有很多其他的方法可以考虑,例如随机列表然后截断,或者某种形式的reservoir sampling。
祝你的作业顺利。
相关问题 更多 >
编程相关推荐