質問
いランダムリストの順列.の要素できないように整数0-x-1です。したいと思いyリストを含むzです。ルールはないことをリストに含める同じ要素を回る全てのリスト回数の各要素は同していただけます。例えば、私の要素0,1,2,3であり、yが6、zは2にすることが考えられる:
0,3 1,2 3,0 2,1 0,1 2,3
各行は独自の要素と要素はあらかじめ組み込まれている3回までとなります。の場合は、7、2つの要素を使うことに4倍探しも、予約も、支払も、全部エ3.
解決
この改善がしているように思える仕事(Python):
import math, random
def get_pool(items, y, z):
slots = y*z
use_each_times = slots/len(items)
exceptions = slots - use_each_times*len(items)
if (use_each_times > y or
exceptions > 0 and use_each_times+1 > y):
raise Exception("Impossible.")
pool = {}
for n in items:
pool[n] = use_each_times
for n in random.sample(items, exceptions):
pool[n] += 1
return pool
def rebalance(ret, pool, z):
max_item = None
max_times = None
for item, times in pool.items():
if times > max_times:
max_item = item
max_times = times
next, times = max_item, max_times
candidates = []
for i in range(len(ret)):
item = ret[i]
if next not in item:
candidates.append( (item, i) )
swap, swap_index = random.choice(candidates)
swapi = []
for i in range(len(swap)):
if swap[i] not in pool:
swapi.append( (swap[i], i) )
which, i = random.choice(swapi)
pool[next] -= 1
pool[swap[i]] = 1
swap[i] = next
ret[swap_index] = swap
def plist(items, y, z):
pool = get_pool(items, y, z)
ret = []
while len(pool.keys()) > 0:
while len(pool.keys()) < z:
rebalance(ret, pool, z)
selections = random.sample(pool.keys(), z)
for i in selections:
pool[i] -= 1
if pool[i] == 0:
del pool[i]
ret.append( selections )
return ret
print plist([0,1,2,3], 6, 2)
他のヒント
Okなので、近似すること
1-シャッフルリスト
2つき楽しめるようになっています。yの最初の要素の次の行
4-繰り返し(2)どの番号のリスト
5-かない場合には十分な数のリストで入れ替え元の一覧を欠の要素だか残念。
6-タステップ(2)として長いお客様のご要望に応じて行
と思うこととしていなかったということではないか、またいでください。プラスは、非常に少ない試験のための複製です。
最初にできることがランダムに並べ替えリストのような気"ランダムに組み"(ハード);か心配1)組(やす)、2)ランダマイズ処理を施して(いる。
したい場合は"本当に"ランダムグループ、お受け止めてランダム化による自然のなかの制約のものの分布"の成果になる場合がありまるやすのに似た。んでも配布、最初のセットを均一に分布し、そしてランダムとしてのグループです。
いて各要素をセットにxを均一に?でな規則からないだけでは解釈:
次の点に注意してください:"すべてのリスト回数の各要素は同一又は近)"
この基準、ルールz < x*私の与件とすることさえ可能です列挙すべての項目のすべてのリストが表示されます。で自動的に作yリストの項目列挙に位置。おばんを満たす上記のルールはどがあった。使用例のx={0,1,2,3}y=6z=2を取得します:0,1 0,1 0,1 0,1 0,1 0,1
現在使用していません2、3、なんでしょうかいがあったので利用します。の開始をおためしください使用しないアプリケーすることを証明するものと思"と"もご利用いず列挙すべての項目を通じて、リストのようになります:0,1 2,3 0,1 2,3 0,1 2,3
最後に、仮に是非参加したいと考えているのです。計算方それぞれの要素がリピート、だか(y*z)/(カウントのx).そのように思って心配のように切り分けていくかの項目が一覧です。がある場合は残り、その結果、以下の1、そのなのを知っていませんが、いずれにせよ、正確な数の繰り返し、その場合されているとは思いませんが、い物してみる廃棄物計算エネルギーです。いると強く主張で最速の成果はまだまだ直列挙としては、上記の計算はこちらかのどちらかぴったなかった。派手なアルゴリズムの抽出からこの計算のどの位置が重複であるもの"というものでし合わせこちらの証拠金".
-各リストと同じzの要素数、クリックするとnhkサイトを離れ覧ることができることによりx、まだ満の定めのないリストを含む場合があり同じ要素。そのため、この規則の要求するzできませんよ。
に基づく新しい内容のコメントのソリューションがありするだけで簡単に実装の標準ランダムに換生成アルゴリズムです。が長い議論のランダムに換生成アルゴリズムはこちら
http://www.techuser.net/randpermgen.html
からGoogle検索:ランダムに換代)
この作品はRuby
# list is the elements to be permuted
# y is the number of results desired
# z is the number of elements per result
# equalizer keeps track of who got used how many times
def constrained_permutations list, y, z
list.uniq! # Never trust the user. We want no repetitions.
equalizer = {}
list.each { |element| equalizer[element] = 0 }
results = []
# Do this until we get as many results as desired
while results.size < y
pool = []
puts pool
least_used = equalizer.each_value.min
# Find how used the least used element was
while pool.size < z
# Do this until we have enough elements in this resultset
element = nil
while element.nil?
# If we run out of "least used elements", then we need to increment
# our definition of "least used" by 1 and keep going.
element = list.shuffle.find do |x|
!pool.include?(x) && equalizer[x] == least_used
end
least_used += 1 if element.nil?
end
equalizer[element] += 1
# This element has now been used one more time.
pool << element
end
results << pool
end
return results
end
使用例:
constrained_permutations [0,1,2,3,4,5,6], 6, 2
=> [[4, 0], [1, 3], [2, 5], [6, 0], [2, 5], [3, 6]]
constrained_permutations [0,1,2,3,4,5,6], 6, 2
=> [[4, 5], [6, 3], [0, 2], [1, 6], [5, 4], [3, 0]]
enter code here