web-dev-qa-db-ja.com

Pythonでn個の数字のリストを作成し、任意の数字をランダムに選択するには?

私は何かを数えて、それがNに出てきました。

ここで、0からN個の数字を含むリストを作成したいと思います。

例:

N = 5

次に、count_list = [1, 2, 3, 4, 5]

どうすればそれができますか?

また、リストを作成したら、そのリストから番号をランダムに選択し、その番号を使用します。

その後、リストの残りの番号(N-1)から別の番号を選択して、それも使用したいと思います。

これでリストは空になります。

これどうやってするの?

24
Sunny

次のような方法で要素の列挙を作成できます。

_mylist = list(xrange(10))
_

次に、_random.choice_関数を使用してアイテムを選択できます。

_import random
...
random.choice(mylist)
_

Asim Ihsanが正しく述べたように、私の答えはOPの完全な問題に対処しませんでした。リストから値を削除するには、単にlist.remove()を呼び出すことができます:

_import random
...
value = random.choice(mylist)
mylist.remove(value)
_

タカタカが指摘したように、組み込み関数xrangerange in Python 3。

34
Constantinius

このコードを試すことができます

import random
N = 5
count_list = range(1,N+1)
random.shuffle(count_list)

while count_list:
    value = count_list.pop()
    # do whatever you want with 'value'
7
Tibo

最初の部分に関して:

>>> N = 5
>>> count_list = [i+1 for i in xrange(N)]
>>> count_list
[1, 2, 3, 4, 5]
>>>

2番目については、9.6。random —擬似乱数を生成を読み取ります。

>>> from random import choice
>>> a = choice(count_list)
>>> a
1
>>> count_list.remove(a)
>>> count_list
[2, 3, 4, 5]

それが一般的な考え方です。

ところで、繰り返しのないリスト内の要素のランダムな選択(Pythonレシピ)

高速ランダム選択にはいくつかの実装があります。

1
Gandi

ランダムな要素を選択する場合、ものを数える必要はありません。 random.choice()を使用して、イテラブルを渡すだけです。

_import random
items = ['foo', 'bar', 'baz']
print random.choice(items)
_

本当にカウントする必要がある場合は、random.randint(1, count+1)を使用してください。

1
patrys

次を使用できます。

import random
random.choice(range(n))

または:

random.choice(range(1,n+1))

1からではなく0からnにしたい場合。

1
Guy

その後、リストの残りの番号(N-1)から別の番号を選択して、それも使用したいと思います。

それから、間違いなく1つを選ぶためだけに1からNまでの数字のリストを作成したくありません(選択するために明示的に作成するのではなく、その範囲の乱数を直接要求しないのはなぜですか?)代わりに、そのようなリストをシャッフルします。幸いなことに、randomモジュールでもこれをカバーしています:random.shuffleを使用してください。

もちろん、膨大な数のリストがあり、数個だけを描画したい場合は、random.choiceを使用してそれぞれを描画して削除することは確かに意味があります。

しかし...いくつかのアイテムのカウントに対応する範囲から数値を選択したいのはなぜですか?番号を使用してアイテムの1つを選択しますか?それをしないでください。それは物事を複雑にしすぎるためにあなたの邪魔になります。アイテムのいずれかを選択する場合は、直接random.choiceを使用して直接選択します。

1
Karl Knechtel

リストが空になるまで、setを維持し、ランダムに選択した要素を(choiceで)削除します。

s = set(range(1, 6))
import random

while len(s) > 0:
  s.remove(random.choice(list(s)))
  print(s)

3回実行すると、3つの異なる答えが得られます。

>>>
set([1, 3, 4, 5])
set([3, 4, 5])
set([3, 4])
set([4])
set([])
>>>
set([1, 2, 3, 5])
set([2, 3, 5])
set([2, 3])
set([2])
set([])

>>>
set([1, 2, 3, 5])
set([1, 2, 3])
set([1, 2])
set([1])
set([])
0
kiriloff

リストを作成(編集):

count_list = range(1, N+1)

ランダム要素を選択:

import random
random.choice(count_list)
0
pvoosten