0

これは、ランダムサンプリングに関連しています。random.sample(number、5)を使用して、数値に含まれる数値の範囲内から乱数のリストを返しています。私はi<100の間に、5つの数値の100セットを返すために使用しています。重複をチェックするために、私は使用しています:

if len(numbers) != len(set(numbers)):

重複のあるセットを識別し、これに続いてrandom.sample(number、5)を実行して、別のランダム化を実行してセットを重複に置き換えようとします。私は約8%が再ランダム化されているようです(どの番号が重複しているかを示すためにprintステートメントを使用して)が、約5%が見落とされているようです。私は間違って何をしていますか?実際のコードは次のとおりです。

while i < 100:
    set1 = random.sample(numbers1,5)
if len(set1) != len(set(set1))
    print('duplicate(s) found, random selection repeated')
set1 = random.sample(numbers1,5)

別のルーチンでは、上記と同じことを行おうとしていますが、同じものを追加し、set1をset2に置き換えて、2つのセットで重複を検索しています。これにより、同じ種類の障害が発生します。set2ルーチンはインデントされ、上記のルーチンのすぐ下に配置されます。i <100の間:set2では繰り返されません。問題を明確に説明できたと思います!!

4

2 に答える 2

0

あなたが与えるコードには明らかにいくつかのギャップがあり、そのままでは機能しないため、エラーがどこにあるかを正確に特定することはできませんがset1 = random.sample(numbers1,5)、ループの終了後に実行whileすると(質問のように記述されている場合は無限です)、すべてが元に戻されます以前に行ったのは、設定したものがすべて上書きさset1れるためです。

とにかく、random.sample交換せずにサンプルを提供する必要があります。繰り返しがrandom.sample(numbers1, 5)ある場合は、すでに繰り返しがあることを意味しますnumbers1。そうでない場合は、の内容を確認し、代わりにnumbers1を使用するなどして、すべてを一意に含めるように強制する必要がありますset(numbers1)

numbers1いくつかの要素をより高い確率で取得したいという理由がある場合は、これを次のように配置することをお勧めします。

set1 = random.sample(numbers1, 5)
while len(set1) != len(set(set1)):
    set1 = random.sample(numbers1, 5)

これはおそらく無限ループですnumbers1が、少なくとも5つの異なる要素が含まれている場合、ある時点でループを終了します。このループが決して終了しないという理論上の可能性が気に入らない場合はrandom.sample、(stackoverflowでこれを行う方法の例がいくつかあります)の代わりに加重サンプルを使用して、すでに選択した数値をから削除する必要があります。重みテーブル。

于 2012-11-20T11:49:36.613 に答える
0

コードには、2番目のサンプルの重複を防ぐものは何もありません。2番目のwhileループのようなことをした場合はどうなりますか?

while i<100:
    i+=1
    set1 = random.sample(numbers1,5)
    while len(set1) != len(set(set1)):
        print('duplicate(s) found, random selection repeated')
        set1 = random.sample(numbers1,5)

もちろん、あなたはまだ何かをするコードの部分を見逃しています...上記を超えて、完全なコードサンプルなしで何を変更する必要があるかを判断するのは難しいです。

編集:コメントからのコードサンプルの作業バージョンは次のとおりです。

def choose_random(list1,n):
    import random 
    i = 0 
    set_list=[]
    major_numbers=range(1,50) + list1
    print(major_numbers) 
    while i <n: 
        set1 =random.sample(major_numbers,5) 
        set2 =random.sample(major_numbers,2) 
        while len(set(set1)) != len(set1):
            print("Duplicate found at %i"%i)
            print set1
            print("Changing to:")
            set1 =random.sample(major_numbers,5) 
            print set1
        set_list.append([set1,set2])
        i +=1
    return set_list
于 2012-11-19T19:26:26.577 に答える