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


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

Jawaban:




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)

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.


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 .


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

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]

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.


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

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


14

jika Anda ingin menggunakan numpy maka gunakan yang berikut ini:

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

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]

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]

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

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.


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.


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.


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


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.