Tạo số nguyên ngẫu nhiên trong khoảng từ 0 đến 9


1338

Làm cách nào tôi có thể tạo số nguyên ngẫu nhiên trong khoảng từ 0 đến 9 (đã bao gồm) trong Python?

Ví dụ, 0, 1, 2, 3, 4, 5, 6, 7, 8,9


16
Phong cách đẹp điểm trên thế hệ "ngẫu nhiên" 0-9
ColinMac

Câu trả lời:


2047

Thử:

from random import randrange
print(randrange(10))

Thông tin thêm: http://docs.python.org/l Library / brandom.html # brandom.randrange


79
Chỉ cần một lưu ý, đây là những số giả và chúng không an toàn về mặt mật mã. Không sử dụng điều này trong mọi trường hợp bạn không muốn kẻ tấn công đoán số của mình. Sử dụng secretsmô-đun cho các số ngẫu nhiên tốt hơn. Tham khảo: docs.python.org/3/library/random.html

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

random.randint(a, b)

Trả về một số nguyên N ngẫu nhiên sao cho a <= N <= b.

Tài liệu: https://docs.python.org/3.1/l Library / brandom.html # brandom.randint


1
Trong các phiên bản Python mới hơn, giới hạn trên dường như là độc quyền (nghĩa là randint(0,9)sẽ không bao giờ trả về 9). Điều này không được phản ánh trong tài liệu trực tuyến, nhưng nó có trong trợ giúp tích hợp.
Yly

134

Thử cái này:

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

Điều này tạo ra 10 số nguyên giả trong phạm vi từ 0 đến 9.


64

Các secretsmô-đun là mới trong Python 3.6. Điều này tốt hơn randommô-đun cho việc sử dụng mật mã hoặc bảo mật.

Để in ngẫu nhiên một số nguyên trong phạm vi bao gồm 0-9:

from secrets import randbelow
print(randbelow(10))

Để biết chi tiết, xem PEP 506 .


3
Điều này sẽ cải thiện câu trả lời và nên được thêm vào. Các câu trả lời bảo mật hơn nên luôn luôn được thêm vào nếu có sẵn.
SudoKid

31

Chọn kích thước của mảng (trong ví dụ này, tôi đã chọn kích thước là 20). Và sau đó, sử dụng như sau:

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

Bạn có thể thấy một đầu ra có dạng sau ( các số nguyên ngẫu nhiên khác nhau sẽ được trả về mỗi lần bạn chạy nó; do đó bạn có thể mong đợi các số nguyên trong mảng đầu ra khác với ví dụ được đưa ra dưới đây ).

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

3
Cũng rất hữu ích khi biết làm thế nào Numpy có thể tạo ra một mảng ngẫu nhiên có kích thước được chỉ định, không chỉ là một số ngẫu nhiên. (Tài liệu: numpy.random.randint )
jkdev

28

Hãy thử điều này thông qua random.shuffle

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

Đây không phải là một câu trả lời chính xác, và nên được xóa.
Nicolas Gervais

22

Tôi sẽ thử một trong những điều sau đây:

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.> ngẫu nhiên.

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.> ngẫu nhiên.

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]

Tốc độ:

np.random.randintnhanh nhất , tiếp theo là np.random.uniformRandom.randrange . Random.randintchậm nhất .

► Cả np.random.randintnp.random.uniform đều nhanh hơn nhiều ( nhanh hơn 8 - 12 lần) so với Random.randrange và 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)

Ghi chú:

1.> np.random.randint tạo các số nguyên ngẫu nhiên trong khoảng thời gian nửa mở [thấp, cao).

2.> np.random.uniform tạo ra các số phân phối đồng đều trong khoảng thời gian nửa mở [thấp, cao).

3.> Random.randrange (dừng) tạo một số ngẫu nhiên từ phạm vi (bắt đầu, dừng, bước).

4.> Random.randint (a, b) trả về một số nguyên N ngẫu nhiên sao cho a <= N <= b.

5.> astype (int) chuyển mảng numpy thành kiểu dữ liệu int.

6.> Tôi đã chọn kích thước = (15,). Điều này sẽ cung cấp cho bạn một mảng dài có độ dài = 15.


Làm thế nào để %timeitlàm việc trong môi trường của bạn?
Cadoiz

18

Trong trường hợp số liên tục randinthoặc randrangecó thể là lựa chọn tốt nhất nhưng nếu bạn có một vài giá trị riêng biệt trong một chuỗi (tức là a list), bạn cũng có thể sử dụng choice:

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

choice cũng hoạt động cho một mục từ một mẫu không liên tục:

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

Nếu bạn cần nó "mạnh về mặt mật mã" thì cũng có một secrets.choicepython 3.6 và mới hơn:

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

Điều gì xảy ra nếu chúng ta muốn nhiều số hơn từ chuỗi?
Gunjan naik

Nếu họ không nên thay thế : random.sample. Với sự thay thế, bạn có thể sử dụng một sự hiểu biết với choice: ví dụ cho một danh sách chứa 3 giá trị ngẫu nhiên với sự thay thế:[choice(values) for _ in range(3)]
MSeifert

18

Trong khi nhiều bài viết trình bày cách lấy một số nguyên ngẫu nhiên, câu hỏi ban đầu hỏi cách tạo số nguyên ngẫu nhiên s (số nhiều):

Làm cách nào tôi có thể tạo số nguyên ngẫu nhiên trong khoảng từ 0 đến 9 (đã bao gồm) trong Python?

Để rõ ràng, ở đây chúng tôi trình bày cách lấy nhiều số nguyên ngẫu nhiên.

Được

>>> import random


lo = 0
hi = 10
size = 5

Nhiều, số nguyên ngẫu nhiên

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

Mẫu số nguyên ngẫu nhiên

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

Chi tiết

Một số bài viết trình bày cách tạo ra nhiều số nguyên ngẫu nhiên. 1 Dưới đây là một số tùy chọn giải quyết câu hỏi ngụ ý:

  • A : random.randomtrả về một float ngẫu nhiên trong phạm vi[0.0, 1.0)
  • B : random.randinttrả về một số nguyên ngẫu nhiên Nsao choa <= N <= b
  • C : random.randrangebí danh đểrandint(a, b+1)
  • D : random.shufflexáo trộn một chuỗi tại chỗ
  • E : random.choicetrả về một phần tử ngẫu nhiên từ chuỗi không trống
  • F : random.choicestrả về các klựa chọn từ một quần thể (có thay thế, Python 3.6+)
  • G : random.sampletrả về kcác lựa chọn duy nhất từ ​​dân số (không thay thế): 2

Xem thêm bài nói chuyện của R. Hettinger về Chunking và Aliasing bằng các ví dụ từ randommô-đun.

Dưới đây là so sánh một số chức năng ngẫu nhiên trong Thư viện chuẩn và 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) |

Bạn cũng có thể nhanh chóng chuyển đổi một trong nhiều bản phân phối trong Numpy thành một mẫu các số nguyên ngẫu nhiên. 3

Ví dụ

>>> 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 Cụ thể là @John Lawrence Aspden, @ST Mohammed, @SiddTheKid, @ user14372, @zangw, et al. 2 @prashanth đề cập đến mô-đun này hiển thị một số nguyên. 3 Chứng minh bởi @Siddharth Satpathy


14

Nếu bạn muốn sử dụng numpy thì hãy sử dụng như sau:

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

1
Bạn có thể nói điều gì đó về "numpy".
Simón

11
Vâng. Cảm ơn các liên kết. Nhưng tôi dự định có nghĩa là bạn có thể đã cải thiện câu trả lời của mình bằng cách cung cấp chi tiết trước khi chỉ trích dẫn hai dòng mã; như vì lý do gì mà ai đó sẽ thích sử dụng nó thay vì một cái gì đó đã được tích hợp sẵn. Dù sao, không phải là bạn bắt buộc phải làm gì.
Simón

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

Để có được danh sách mười mẫu:

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

7

Tạo số nguyên ngẫu nhiên trong khoảng từ 0 đến 9.

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

Đầu ra:

[4 8 0 4 9 6 9 9 0 7]

6

random.sample là một cái khác có thể được sử dụng

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

6

Cách tốt nhất là sử dụng chức năng nhập ngẫu nhiên

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

hoặc không có bất kỳ nhập thư viện:

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

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

ở đây các popitems loại bỏ và trả về một giá trị tùy ý từ từ điển n.


3

Đây là một cách tiếp cận toán học nhiều hơn nhưng nó hoạt động 100% thời gian:

Giả sử bạn muốn sử dụng random.random()hàm để tạo số giữa ab. Để đạt được điều này, chỉ cần làm như sau:

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

Tất nhiên, bạn có thể tạo ra nhiều số hơn.


2

Từ trang tài liệu cho mô-đun ngẫu nhiên :

Cảnh báo: Không nên sử dụng các bộ tạo giả ngẫu nhiên của mô-đun này cho mục đích bảo mật. Sử dụng os.urandom () hoặc SystemRandom nếu bạn yêu cầu trình tạo số giả ngẫu nhiên an toàn bằng mật mã.

Random.SystemRandom , được giới thiệu trong Python 2.4, được coi là bảo mật bằng mật mã . Nó vẫn có sẵn trong Python 3.7.1, hiện tại tại thời điểm viết.

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

Thay vì string.digits, rangecó thể được sử dụng cho một số câu trả lời khác cùng với một sự hiểu biết. Trộn và kết hợp theo nhu cầu của bạn.


0

OpenTURNS cho phép không chỉ mô phỏng các số nguyên ngẫu nhiên mà còn xác định phân phối liên quan với UserDefinedlớp được xác định.

Sau đây mô phỏng 12 kết quả của phân phối.

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)

Bản in này:

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

Dấu ngoặc ở đó vì xlà một Pointchiều. Sẽ dễ dàng hơn để tạo ra 12 kết quả trong một cuộc gọi đến getSample:

sample = distribution.getSample(12)

sẽ sản xuất:

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

Thông tin chi tiết về chủ đề này có tại đây: http://openturns.github.io/openturns/master/user_manual/_generated/openturns.UserDefined.html


-1

Tôi đã có may mắn hơn với điều này cho Python 3.6

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

Chỉ cần thêm các ký tự như 'ABCD' và 'abcd' hoặc '^! ~ = -> <' để thay đổi nhóm ký tự cần kéo, thay đổi phạm vi để thay đổi số lượng ký tự được tạo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.