在写ruby代码,想要将给定的一个数组随机打乱,在网上找了半天,看别人的代码始终觉得有点糊涂,于是自己写了一个:
def randomArray(arr)
newArr = []
arr.count.times do
index = arr.count
newArr << arr[rand(index)]
arr = arr - newArr
end
newArr
end
实验几个例子:
p randomArray([1,2,3,4])
p randomArray(["a","b","c","d","e","f","g"])
p randomArray(["a","b","c","a","a"])
# 返回:
# [2, 4, 3, 1]
# ["f", "d", "b", "c", "g", "e", "a"]
# ["a", "c", "b", nil, nil] # 这里有问题
每次运行,会出现不同的顺序。
但是看到有重复元素的组会出现问题,
改进一下代码:
# 将一个数组打乱
def randomArray(arr)
# 先将arr的index打乱
indexList = (1..arr.count).to_a
ranIndexList = []
indexList.count.times do
i = indexList.count
ranIndexList << indexList[rand(i)]
indexList = indexList - ranIndexList
end
# 然后再按照打乱的idnex重新组合
newArr = []
ranIndexList.each do |i|
newArr << arr[i-1]
end
newArr
end
再试试:
p randomArray([1,2,2,"a","a"])
p randomArray(["a","b","c","a","a"]
# [2, 2, 1, "a", "a"]
# ["a", "a", "b", "c", "a"]
最后泪崩,ruby中也有shuffle的功能:
arr.shuffle