0から9までのランダムな整数を生成する


1338

Pythonで0から9までの整数をランダムに生成するにはどうすればよいですか?

たとえば、0123456789


16
0-9の「ランダムな」世代の素敵なスタイルポイント
ColinMac

回答:


2047

試してください:

from random import randrange
print(randrange(10))

詳細:http : //docs.python.org/library/random.html#random.randrange


79
これらは疑似乱数であり、暗号的に安全ではありません。攻撃者に数値を推測させたくない場合は、これを使用しないでください。secretsより良い乱数のためにモジュールを使用してください。リファレンス:docs.python.org/3/library/random.html

466
import random
print(random.randint(0,9))

random.randint(a, b)

a <= N <= bとなるようなランダムな整数Nを返します。

ドキュメント:https : //docs.python.org/3.1/library/random.html#random.randint


1
新しいPythonバージョンでは、上限は排他的であるようです(つまり、randint(0,9)9を返すことはありません)。これはオンラインマニュアルには反映されていませんが、組み込みのヘルプには記載されています。
Yly

134

これを試して:

from random import randrange, uniform

# randrange gives you an integral value
irand = randrange(0, 10)

# uniform gives you a floating-point value
frand = uniform(0, 10)

81
from random import randint

x = [randint(0, 9) for p in range(0, 10)]

これにより、0〜9の範囲の10個の疑似乱数整数が生成されます。


64

このsecretsモジュールはPython 3.6の新機能です。これはrandom、暗号化またはセキュリティ用途のモジュールよりも優れています。

0から9までの範囲の整数をランダムに出力するには、次のように入力します。

from secrets import randbelow
print(randbelow(10))

詳細については、PEP 506を参照してください。


3
これは答えを改善するため、追加する必要があります。可能な場合は、セキュリティを重視する回答を常に追加する必要があります。
SudoKid 2018

31

配列のサイズを選択します(この例では、サイズを20に選択しています)。次に、以下を使用します。

import numpy as np   
np.random.randint(10, size=(1, 20))

次の形式の出力が表示されることが期待できます(実行するたびに異なるランダムな整数が返されます。したがって、出力配列の整数は以下の例とは異なることが予想されます)。

array([[1, 6, 1, 2, 8, 6, 3, 3, 2, 5, 6, 5, 0, 9, 5, 6, 4, 5, 9, 3]])

3
Numpyが単一の乱数だけでなく、指定されたサイズのランダム配列を生成する方法を知ることも役立ちます。(ドキュメント:numpy.random.randint
jkdev 2017年

28

これを試してみてください random.shuffle

>>> import random
>>> nums = range(10)
>>> random.shuffle(nums)
>>> nums
[6, 3, 5, 4, 0, 1, 2, 9, 8, 7]

これは正解ではないため、削除する必要があります。
Nicolas Gervais

22

次のいずれかを試します。

1.> numpy.random.randint

import numpy as np
X1 = np.random.randint(low=0, high=10, size=(15,))

print (X1)
>>> array([3, 0, 9, 0, 5, 7, 6, 9, 6, 7, 9, 6, 6, 9, 8])

2.> numpy.random.uniform

import numpy as np
X2 = np.random.uniform(low=0, high=10, size=(15,)).astype(int)

print (X2)
>>> array([8, 3, 6, 9, 1, 0, 3, 6, 3, 3, 1, 2, 4, 0, 4])

3.> random.randrange

from random import randrange
X3 = [randrange(10) for i in range(15)]

print (X3)
>>> [2, 1, 4, 1, 2, 8, 8, 6, 4, 1, 0, 5, 8, 3, 5]

4.> random.randint

from random import randint
X4 = [randint(0, 9) for i in range(0, 15)]

print (X4)
>>> [6, 2, 6, 9, 5, 3, 2, 3, 3, 4, 4, 7, 4, 9, 6]

速度:

np.random.randintがある最速に続く、np.random.uniformrandom.randrangerandom.randint最も遅いです。

►np.random.randintnp.random.uniformは、どちらもrandom.randrangerandom.randintよりもはるかに高速です約8〜12倍高速)。

%timeit np.random.randint(low=0, high=10, size=(15,))
>> 1.64 µs ± 7.83 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit np.random.uniform(low=0, high=10, size=(15,)).astype(int)
>> 2.15 µs ± 38.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit [randrange(10) for i in range(15)]
>> 12.9 µs ± 60.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit [randint(0, 9) for i in range(0, 15)]
>> 20 µs ± 386 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

ノート:

1.> np.random.randintは、半開区間[低、高)にわたってランダムな整数を生成します。

2.> np.random.uniformは、半開区間[低、高)にわたって均一に分散された数値を生成します。

3.> random.randrange(stop)は、range(start、stop、step)から乱数を生成します。

4.> random.randint(a、b)は <= N <= bのようなランダムな整数Nを返します。

5.> astype(int)は、numpy配列をintデータ型にキャストします。

6.>サイズ=(15、)を選択しました。これにより、長さ= 15の派手な配列が得られます。


%timeitあなたの環境ではどのように機能しますか?
カディス

18

連続した数値の場合、randintまたはrandrangeおそらく最良の選択ですが、シーケンスに複数の異なる値(つまりlist)がある場合は、次のように使用することもできますchoice

>>> import random
>>> values = list(range(10))
>>> random.choice(values)
5

choice 非連続サンプルの1つのアイテムでも機能します。

>>> values = [1, 2, 3, 5, 7, 10]
>>> random.choice(values)
7

「暗号的に強力」が必要な場合はsecrets.choice、Python 3.6以降にもあります。

>>> import secrets
>>> values = list(range(10))
>>> secrets.choice(values)
2

シーケンスの数を増やしたい場合はどうなりますか?
Gunjan naik 2017

彼らは交換せずにする必要がある場合:random.sample。置換を使用すると、次のように内包表記を使用できますchoice。たとえば、置換された3つのランダムな値を含むリストの場合:[choice(values) for _ in range(3)]
MSeifert

18

多くの投稿は1つのランダムな整数を取得する方法を示していますが、元の質問はランダムな整数s(複数)を生成する方法を尋ねています。

Pythonで0から9までの整数をランダムに生成するにはどうすればよいですか?

明確にするために、ここでは複数のランダムな整数を取得する方法を示します。

与えられた

>>> import random


lo = 0
hi = 10
size = 5

コード

複数のランダムな整数

# A
>>> [lo + int(random.random() * (hi - lo)) for _ in range(size)]
[5, 6, 1, 3, 0]

# B
>>> [random.randint(lo, hi) for _ in range(size)]
[9, 7, 0, 7, 3]

# C
>>> [random.randrange(lo, hi) for _ in range(size)]
[8, 3, 6, 8, 7]

# D
>>> lst = list(range(lo, hi))
>>> random.shuffle(lst)
>>> [lst[i] for i in range(size)]
[6, 8, 2, 5, 1]

# E
>>> [random.choice(range(lo, hi)) for _ in range(size)]
[2, 1, 6, 9, 5]

ランダム整数のサンプル

# F
>>> random.choices(range(lo, hi), k=size)
[3, 2, 0, 8, 2]

# G
>>> random.sample(range(lo, hi), k=size)
[4, 5, 1, 2, 3]

詳細

一部の投稿では、複数のランダムな整数をネイティブに生成する方法を示しています。1 暗黙の質問に対処するいくつかのオプションを次に示します。

  • Arandom.random範囲内のランダムな浮動小数点数を返します[0.0, 1.0)
  • Brandom.randint次のNようなランダムな整数を返しますa <= N <= b
  • C:のrandom.randrangeエイリアスrandint(a, b+1)
  • Drandom.shuffleシーケンスを所定の位置に入れ替えます
  • Erandom.choice空でないシーケンスからランダムな要素を返します
  • F:母集団からの選択をrandom.choices返しますk(置換、Python 3.6以降)。
  • G:母集団からの一意の選択をrandom.sample返しますk(置換なし):2

モジュールの例を使用したチャンキングとエイリアスに関するR.ヘッティンガーの講演も参照してくださいrandom

これは、標準ライブラリとNumpyのいくつかのランダム関数の比較です:

| | random                | numpy.random                     |
|-|-----------------------|----------------------------------|
|A| random()              | random()                         |
|B| randint(low, high)    | randint(low, high)               |
|C| randrange(low, high)  | randint(low, high)               |
|D| shuffle(seq)          | shuffle(seq)                     |
|E| choice(seq)           | choice(seq)                      |
|F| choices(seq, k)       | choice(seq, size)                |
|G| sample(seq, k)        | choice(seq, size, replace=False) |

Numpy の多くの分布の 1つをランダムな整数のサンプルにすばやく変換することもできます。

>>> np.random.normal(loc=5, scale=10, size=size).astype(int)
array([17, 10,  3,  1, 16])

>>> np.random.poisson(lam=1, size=size).astype(int)
array([1, 3, 0, 2, 0])

>>> np.random.lognormal(mean=0.0, sigma=1.0, size=size).astype(int)
array([1, 3, 1, 5, 1])

1つまり、@ John Lawrence Aspden、@ ST Mohammed、@ SiddTheKid、@ user14372、@ zangwなど。 2 @prashanthは、このモジュールが1つの整数を表示することを述べています。 3 @Siddharth Satpathyによる実証


14

numpyを使用する場合は、以下を使用します。

import numpy as np
print(np.random.randint(0,10))

1
「numpy」について何かを伝えることができます。
シモン

11
うん。リンクをありがとう。しかし、2行のコードを引用する前に詳細を提供することで、答えを改善できることを意味しました。どのような理由で、誰かがすでに組み込まれているものの代わりにそれを使用することを好むでしょう。とにかく、あなたが義務を負うものではありません。
シモン

9
>>> import random
>>> random.randrange(10)
3
>>> random.randrange(10)
1

10個のサンプルのリストを取得するには:

>>> [random.randrange(10) for x in range(10)]
[9, 0, 4, 0, 5, 7, 4, 3, 6, 8]


6

random.sample 使用できる別のものです

import random
n = 1 # specify the no. of numbers
num = random.sample(range(10),  n)
num[0] # is the required number

6

最良の方法はインポートランダム関数を使用することです

import random
print(random.sample(range(10), 10))

またはライブラリのインポートなし:

n={} 
for i in range(10):
    n[i]=i

for p in range(10):
    print(n.popitem()[1])

ここでpopitemsは、辞書から任意の値を削除して返しますn


3

これはより数学的なアプローチですが、100%機能します。

random.random()関数を使用してaとの間の数を生成するとしbます。これを実現するには、次のようにします。

num = (b-a)*random.random() + a;

もちろん、より多くの数を生成できます。


2

randomモジュールのドキュメントページから:

警告:このモジュールの疑似ランダムジェネレーターは、セキュリティ上の目的で使用しないでください。暗号的に安全な疑似乱数ジェネレータが必要な場合は、os.urandom()またはSystemRandomを使用してください。

Python 2.4で導入されたrandom.SystemRandomは暗号的に安全であると考えられています。執筆時点で最新のPython 3.7.1でも引き続き使用できます。

>>> import string
>>> string.digits
'0123456789'
>>> import random
>>> random.SystemRandom().choice(string.digits)
'8'
>>> random.SystemRandom().choice(string.digits)
'1'
>>> random.SystemRandom().choice(string.digits)
'8'
>>> random.SystemRandom().choice(string.digits)
'5'

の代わりにstring.digitsrangeおそらく理解とともに、他のいくつかの回答に従って使用できます。必要に応じて混ぜ合わせてください。


0

OpenTURNSは、ランダムな整数をシミュレートするだけでなく、関連する分布を UserDefined定義されたクラスに。

以下は、分布の12の結果をシミュレートします。

import openturns as ot
points = [[i] for i in range(10)]
distribution = ot.UserDefined(points) # By default, with equal weights.
for i in range(12):
    x = distribution.getRealization()
    print(i,x)

これは印刷します:

0 [8]
1 [7]
2 [4]
3 [7]
4 [3]
5 [3]
6 [2]
7 [9]
8 [0]
9 [5]
10 [9]
11 [6]

括弧は1次元であるためx、そこにありPointます。への1回の呼び出しで12の結果を生成する方が簡単ですgetSample

sample = distribution.getSample(12)

生成されます:

>>> print(sample)
     [ v0 ]
 0 : [ 3  ]
 1 : [ 9  ]
 2 : [ 6  ]
 3 : [ 3  ]
 4 : [ 2  ]
 5 : [ 6  ]
 6 : [ 9  ]
 7 : [ 5  ]
 8 : [ 9  ]
 9 : [ 5  ]
10 : [ 3  ]
11 : [ 2  ]

このトピックの詳細については、こちらをご覧ください。http//openturns.github.io/openturns/master/user_manual/_generated/openturns.UserDefined.html


-1

私はこれでPython 3.6の方が運が良かった

str_Key = ""                                                                                                
str_RandomKey = ""                                                                                          
for int_I in range(128):                                                                                    
      str_Key = random.choice('0123456789')
      str_RandomKey = str_RandomKey + str_Key 

「ABCD」や「abcd」または「^!〜=-> <」などの文字を追加して、取得する文字プールを変更し、範囲を変更して、生成される文字数を変更します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.