题目描述:随机的从大小为n的数组中选取m个整数,要求每个元素被选中的概率相等。
分析与解答:首先从有N个元素的数组中随机选出一个元素,然后把这个选中的数字与数组中第一个元素交换,接着从数组后面N-1个数字中选出1个元素与数组中第二个元素交换,以此类推,直到选出m个数字为止,数组前m个数字就是随机选出来的m个数字,且他们被选中的概率相同。
import random
def getRandomM(a, n, m):
if a == None or n <= 0 or n < m:
print("参数不合理")
return
i = 0
while i < m:
j = random.randint(i, n - 1) # 获取i到n-1间的随机树
# 随机选出的元素放到数组的前面
tmp = a[i]
a[i] = a[j]
a[j] = tmp
i += 1
if __name__ == "__main__":
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
n = 10
m = 6
getRandomM(a, n, m)
i = 0
while i < m:
print(a[i], end=" ")
i += 1