-4

random.randint を使用して、Python のリストから名前をランダムに選択する必要があります。

私はこれまでやってきました。しかし、繰り返しなしで印刷する方法がわかりません。名前のいくつかは、10 から 15 の名前の後にそれらを繰り返します。

私を助けてください。高度な機能を使用することはできません。私は単純な関数でそれを行う必要があります。これが私のプログラムです。

import random
names = [about 150 names]
print([names[random.randint(0, len(names)-1)] for i in range(user_input)])
4

4 に答える 4

3

破壊的に変更できる場合は、値をコピーするのではなく、値namesだけを変更します。popその後、彼らはもうそこにいないので、繰り返すことはできません.

を破壊的に変更できない場合はnames、コピーに対して同じことを行います。

tmp = names[:]
result = [tmp.pop(random.randrange(len(tmp))) for _ in range(user_input)]

popリストの中央からそれぞれがリストの半分を 1 ノッチ上にシフトする必要があるため、これには 2 次パフォーマンスがあります。しかし、150 名の場合、これが問題になる可能性はほとんどありません。たとえば、私のラップトップでは、150 個の名前から 100 個の値を選択するのに 83 マイクロ秒かかります。

randrange の使用が本当に許可されていない場合は、自分で記述できます。

def randrange(x): return randint(0, x-1)
于 2014-01-18T09:59:36.507 に答える
1

これらの制限はかなりばかげています。「高度な関数」とは何かわかりませんが、前回の質問で関数を提供した後もサポートが必要なので、関数宣言は許可されていないのでしょうか?

それでも、関数がなくても同じことができます。すでに使用したインデックスを追跡する必要があるだけです。別の方法を次に示します。

indices = []
for x in range(5):
    index = random.randint(0, len(population)-1)
    while index in indices:
        index = random.randint(0, len(population)-1)
    indices.append(index)
names = [population[i] for i in indices]
于 2014-01-18T09:57:52.753 に答える
0

randintと基本的な操作 (ループ、割り当て、およびサブリスティング)のみを使用できると仮定すると、そのような結果を得るために「その場でのシャッフル トリック」(Fisher Yates の最新バージョン) を実行できます。

copy = names[:]    
for i in xrange( user_input-1, 1, -1 ):
  swap = random.randint(0, i) 
  copy[i],copy[swap] = copy[swap],copy[i]

print copy[ :user_input ]
于 2014-01-18T09:52:26.413 に答える
-1

と同じ長さの乱数の配列を生成しますnames

sortarr = [random.randint(0, 10*len(names)) for i in range(len(names))] 

namesこの新しい配列に基づいて配列をソートします

names = [name for sa, name in sorted(zip(sortarr, names))]

それが行うことは、にいくつかの乱数を割り当てることnamesです。それらは繰り返すことができますが、2 つの数字が同じである場合、任意の名前に割り当てられるため、繰り返しの名前は作成されません。

于 2014-01-18T09:54:38.520 に答える