1
A
回答
2
你可以通過執行以下步驟:
- 獲取不受約束的樣品
- 如果在有限的重複值的
n
情況下,最多m
被允許,刪除所有n
並添加返回m
- 隨機選擇
n-m
值的數組由初始範圍的元素減去限定的重複值 - 洗牌所得陣列
代碼
def random_with_limit(range, sample_size, limited_repeat_value, max_instances)
a = Array.new(sample_size) { rand range }
extra = a.count(limited_repeat_value) - max_instances
puts "inital number of #{limited_repeat_value} = #{max_instances+extra}"
return a if extra <= 0
b = [*range]-[limited_repeat_value]
(a-[limited_repeat_value]).
concat([limited_repeat_value]*max_instances).
concat(Array.new(extra) { b.sample }).
shuffle
end
的puts
語句僅用於說明包括在內。
實例
我已經創建了一個輔助用於顯示隨機選擇的範圍內的每個元素的號碼。此方法還會打印初始不受限制的示例中指定元素的實例數。
def show_result(range, sample_size, limited_repeat_value, max_instances)
random_with_limit(2..11, 50, 4, 3).sort.chunk(&:itself).map { |n,dups|
"#{n} (#{dups.count})" }
end
show_result(2..11, 50, 4, 3)
# inital number of 4 = 4
#=> ["2 (6)", "3 (10)", "4 (3)", "5 (5)", "6 (5)",
# "7 (6)", "8 (5)", "9 (2)", "10 (6)", "11 (2)"]
show_result(2..11, 50, 4, 3)
# inital number of 4 = 3
#=> ["2 (7)", "3 (5)", "4 (3)", "5 (3)", "6 (4)",
# "7 (6)", "8 (5)", "9 (6)", "10 (7)", "11 (4)"]
show_result(2..11, 50, 4, 3)
# inital number of 4 = 2
#=> ["2 (5)", "3 (5)", "4 (2)", "5 (4)", "6 (8)",
# "7 (8)", "8 (1)", "9 (7)", "10 (4)", "11 (6)"]
show_result(2..11, 50, 4, 3)
# inital number of 4 = 7
#=> ["2 (2)", "3 (8)", "4 (3)", "5 (8)", "6 (5)",
# "7 (3)", "8 (3)", "9 (6)", "10 (5)", "11 (7)"]
替代做法
- 確定有限重複值的情況下的指標
- 如果有
n > m
,隨機 - 選擇
n-m
在與隨機的n-m
選定索引替換值在第一個解決方案中選擇的值
def random_with_limit(range, sample_size, limited_repeat_value, max_instances)
a = Array.new(sample_size) { rand range }
extra = a.count(limited_repeat_value) - max_instances
puts "inital number of #{limited_repeat_value} = #{max_instances+extra}"
return a if extra <= 0
idx = a.each_with_index.select { |x,_| x == limited_repeat_value }.map(&:last)
b = [*range]-[limited_repeat_value]
idx.shuffle.first(extra).each { |i| a[i] = b.sample }
a
end
show_result(2..11, 50, 4, 3)
# inital number of 4 = 6
# => ["2 (2)", "3 (3)", "4 (3)", "5 (4)", "6 (7)",
# "7 (12)", "8 (4)", "9 (7)", "10 (5)", "11 (3)"]
show_result(2..11, 50, 4, 3)
# inital number of 4 = 2
#=> ["2 (9)", "3 (3)", "4 (2)", "5 (6)", "6 (6)",
# "7 (3)", "8 (2)", "9 (5)", "10 (9)", "11 (5)"]
show_result(2..11, 50, 4, 3)
# inital number of 4 = 4
#=> ["2 (3)", "3 (3)", "4 (3)", "5 (5)", "6 (4)",
# "7 (7)", "8 (6)", "9 (4)", "10 (7)", "11 (8)"]
2
我認爲沒有默認的方法來做到這一點。你需要寫一些代碼,例如馬克·塔爾博特檢查這個答案:https://stackoverflow.com/a/9458016/1306709
a = (100..999).to_a.shuffle
那麼你需要一個新的ID
new_id = a.pop
這保證了數字不會被重用。每次。當然,當數組中的元素用盡時,您會遇到問題。
所以如果你需要重複幾次 - 結合了幾臺用相同的數字,並從中pop
。
相關問題
- 1. 範圍內的非重複隨機值
- 2. 隨機化一個列表,但範圍
- 3. 生成一定範圍內沒有重複的隨機數
- 4. 生成一個小範圍的隨機不重複的整數
- 5. 獲得隨機沒有範圍之間沒有重複
- 6. Matlab隨機數範圍
- 7. 隨機位在範圍
- 8. 使用int變量獲取範圍以獲得隨機數
- 9. 是否可以改變隨機數的範圍?
- 10. 在一個範圍內生成'n'唯一的隨機數
- 11. 在一個範圍內生成'n'個唯一隨機數
- 12. 如何在python中生成特定範圍內的n維隨機變量
- 13. Python:隨機沒有重複,但在def
- 14. 從重複範圍
- 15. 如何在1..n範圍內使用不同的隨機數在1到n範圍內使用vba代碼
- 16. $範圍可變跨NG重複
- 17. 範圍(n)[x:y:z]
- 18. 隨機行爲:重複相同數量
- 19. 在VBA中重複隨機變量
- 20. 的javascript:從範圍生成2個隨機,但不同數字
- 21. 使用rbinom生成隨機數,但排除範圍內的0
- 22. 如何在python中生成一個隨機數的範圍而不重複
- 23. 生成不重複的隨機數在一個真正的大範圍
- 24. 函數將範圍內的隨機數保存到數組而不重複
- 25. 如何重複後隨機排列索引列表(串),超出範圍
- 26. 如何從一個範圍內生成3個非重複的隨機數字?
- 27. 在不重複的情況下生成範圍內的隨機數
- 28. 計算在一個範圍內重複n次的不同項目的數量
- 29. 具有隨機範圍和函數的隨機數組
- 30. 在隨機字節的給定範圍內生成隨機數
做得很漂亮。謝謝 – Misha