Hasilkan bilangan bulat acak antara 0 dan 9

1339

Bagaimana saya bisa menghasilkan bilangan bulat acak antara 0 dan 9 (inklusif) dengan Python?

Sebagai contoh, 0, 1, 2, 3, 4, 5, 6, 7, 8,9

aneuryzm
sumber
16
Poin gaya yang bagus pada generasi "acak" 0-9
ColinMac

Jawaban:

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

random.randint(a, b)

Kembalikan integer acak N sehingga a <= N <= b.

Documents: https://docs.python.org/3.1/library/random.html#random.randint

JMSamudio
sumber
1
Dalam versi Python yang lebih baru, batas atas tampaknya eksklusif (yaitu randint(0,9)tidak akan pernah mengembalikan 9). Ini tidak tercermin dalam dokumentasi online, tetapi dalam bantuan bawaan.
Yly
134

Coba ini:

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)
Andrew Hare
sumber
81
from random import randint

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

Ini menghasilkan 10 bilangan bulat pseudorandom dalam kisaran 0 hingga 9 inklusif.

pengguna14372
sumber
64

The secretsmodul baru di Python 3.6. Ini lebih baik daripada randommodul untuk penggunaan kriptografi atau keamanan.

Untuk mencetak bilangan bulat secara acak dalam rentang inklusif 0-9:

from secrets import randbelow
print(randbelow(10))

Untuk detailnya, lihat PEP 506 .

Chris_Rands
sumber
3
Ini akan meningkatkan jawaban dan harus ditambahkan. Jawaban yang lebih mengutamakan keamanan harus selalu ditambahkan jika tersedia.
SudoKid
31

Pilih ukuran array (dalam contoh ini, saya telah memilih ukuran menjadi 20). Dan kemudian, gunakan yang berikut ini:

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

Anda dapat mengharapkan untuk melihat output dari bentuk berikut ( bilangan bulat acak yang berbeda akan dikembalikan setiap kali Anda menjalankannya; karenanya Anda dapat mengharapkan bilangan bulat dalam larik keluaran berbeda dari contoh yang diberikan di bawah ini ).

array([[1, 6, 1, 2, 8, 6, 3, 3, 2, 5, 6, 5, 0, 9, 5, 6, 4, 5, 9, 3]])
Orang biasa
sumber
3
Ini juga membantu untuk mengetahui bagaimana Numpy dapat menghasilkan array acak dengan ukuran yang ditentukan, bukan hanya satu nomor acak. (Documents: numpy.random.randint )
jkdev
28

Coba ini random.shuffle

>>> import random
>>> nums = range(10)
>>> random.shuffle(nums)
>>> nums
[6, 3, 5, 4, 0, 1, 2, 9, 8, 7]
zangw
sumber
Ini bukan jawaban yang benar, dan harus dihapus.
Nicolas Gervais
22

Saya akan mencoba salah satu dari yang berikut:

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.> acak

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]

Kecepatan:

np.random.randint adalah yang tercepat , diikuti oleh np.random.uniform dan random.randrange . random.randint adalah yang paling lambat .

► Baik np.random.randint dan np.random.uniform jauh lebih cepat (~ 8 - 12 kali lebih cepat) daripada random.randrange dan random.randint .

%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)

Catatan:

1.> np.random.randint menghasilkan bilangan bulat acak selama interval setengah terbuka [rendah, tinggi).

2.> np.random.uniform menghasilkan angka yang terdistribusi secara merata selama interval setengah terbuka [rendah, tinggi).

3.> random.randrange (berhenti) menghasilkan angka acak dari rentang (mulai, berhenti, langkah).

4.> random.randint (a, b) mengembalikan bilangan bulat acak N sehingga a <= N <= b.

5.> astype (int) melemparkan array numpy ke tipe data int.

6.> Saya telah memilih size = (15,). Ini akan memberi Anda array numpy dengan panjang = 15.

Siddharth Satpathy
sumber
Bagaimana cara %timeitkerjanya di lingkungan Anda?
Cadoiz
18

Dalam hal bilangan kontinu randintatau randrangemungkin merupakan pilihan terbaik tetapi jika Anda memiliki beberapa nilai berbeda secara berurutan (yaitu a list) Anda juga dapat menggunakan choice:

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

choice juga berfungsi untuk satu item dari sampel yang tidak berkelanjutan:

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

Jika Anda membutuhkannya "kuat secara kriptografis" ada juga secrets.choicedi python 3.6 dan yang lebih baru:

>>> import secrets
>>> values = list(range(10))
>>> secrets.choice(values)
2
MSeifert
sumber
Bagaimana jika kita ingin lebih banyak angka dari urutan?
Gunjan naik
Jika mereka harus tanpa penggantian: random.sample. Dengan penggantian, Anda dapat menggunakan pemahaman dengan choice: misalnya untuk daftar yang berisi 3 nilai acak dengan penggantian:[choice(values) for _ in range(3)]
MSeifert
18

Sementara banyak posting menunjukkan bagaimana untuk mendapatkan satu integer acak, pertanyaan awal bertanya bagaimana untuk menghasilkan integer acak s (jamak):

Bagaimana saya bisa menghasilkan bilangan bulat acak antara 0 dan 9 (inklusif) dengan Python?

Untuk kejelasan, di sini kami mendemonstrasikan cara mendapatkan beberapa bilangan bulat acak.

Diberikan

>>> import random


lo = 0
hi = 10
size = 5

Kode

Banyak, Integer Acak

# 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]

Contoh Bilangan Bulat Acak

# 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]

Detail

Beberapa postingan menunjukkan cara membuat banyak bilangan bulat acak. 1 Berikut adalah beberapa opsi yang menjawab pertanyaan tersirat:

Lihat juga ceramah R. Hettinger tentang Chunking dan Aliasing menggunakan contoh-contoh dari randommodul.

Berikut ini adalah perbandingan beberapa fungsi acak di Perpustakaan Standar dan 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) |

Anda juga dapat dengan cepat mengkonversi salah satu dari banyak distribusi di Numpy ke sampel bilangan bulat acak. 3

Contohnya

>>> 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 Yaitu @John Lawrence Aspden, @ST Mohammed, @SiddTheKid, @ user14372, @zangw, dkk. 2 @prashanth menyebutkan modul ini menunjukkan satu bilangan bulat. 3 Ditunjukkan oleh @Siddharth Satpathy

pylang
sumber
14

jika Anda ingin menggunakan numpy maka gunakan yang berikut ini:

import numpy as np
print(np.random.randint(0,10))
sushmit
sumber
1
Anda bisa mengatakan sesuatu tentang "numpy".
Simón
11
Ya. Terima kasih untuk tautannya. Tetapi saya bermaksud mengatakan bahwa Anda dapat meningkatkan jawaban Anda dengan memberikan perincian sebelum hanya mengutip dua baris kode; seperti untuk alasan apa seseorang lebih suka menggunakannya daripada sesuatu yang sudah ada di dalamnya. Lagi pula, Anda tidak wajib melakukannya.
Simón
9
>>> import random
>>> random.randrange(10)
3
>>> random.randrange(10)
1

Untuk mendapatkan daftar sepuluh sampel:

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

Menghasilkan bilangan bulat acak antara 0 dan 9.

import numpy
X = numpy.random.randint(0, 10, size=10)
print(X)

Keluaran:

[4 8 0 4 9 6 9 9 0 7]
Ashok Kumar Jayaraman
sumber
6

random.sample adalah hal lain yang bisa digunakan

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

Cara terbaik adalah dengan menggunakan fungsi acak impor

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

atau tanpa impor pustaka:

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

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

di sini popitem menghapus dan mengembalikan nilai arbitrer dari kamus n.

ST Mohammed
sumber
3

Ini lebih merupakan pendekatan matematis tetapi berhasil 100% dari waktu:

Katakanlah Anda ingin menggunakan random.random()fungsi untuk menghasilkan angka antara adan b. Untuk mencapai ini, lakukan saja hal berikut:

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

Tentu saja, Anda dapat menghasilkan lebih banyak angka.

Orestis Zekai
sumber
2

Dari halaman dokumentasi untuk modul acak :

Peringatan: Generator pseudo-acak dari modul ini tidak boleh digunakan untuk tujuan keamanan. Gunakan os.urandom () atau SystemRandom jika Anda memerlukan generator nomor pseudo-acak yang aman secara kriptografis.

random.SystemRandom , yang diperkenalkan dengan Python 2.4, dianggap aman secara kriptografis . Ini masih tersedia dalam Python 3.7.1 yang saat ini sedang ditulis.

>>> 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'

Alih-alih string.digits, rangedapat digunakan untuk beberapa jawaban lain bersama mungkin dengan pemahaman. Padu padan sesuai kebutuhan Anda.

rriehle
sumber
0

OpenTURNS memungkinkan untuk tidak hanya mensimulasikan bilangan bulat acak tetapi juga untuk menentukan distribusi terkait dengan UserDefined kelas yang ditentukan.

Berikut ini mensimulasikan 12 hasil distribusi.

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)

Ini mencetak:

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

Tanda kurung yang ada karena xmerupakan Pointdalam 1-dimensi. Akan lebih mudah untuk menghasilkan 12 hasil dalam satu panggilan ke getSample:

sample = distribution.getSample(12)

akan menghasilkan:

>>> 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  ]

Rincian lebih lanjut tentang topik ini ada di sini: http://openturns.github.io/openturns/master/user_manual/_generated/openturns.UserDefined.html

Michael Baudin
sumber
-1

Saya lebih beruntung dengan ini untuk Python 3.6

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

Cukup tambahkan karakter seperti 'ABCD' dan 'abcd' atau '^! ~ = -> <' untuk mengubah kumpulan karakter untuk menarik, ubah rentang untuk mengubah jumlah karakter yang dihasilkan.

Kepala MT
sumber