Створити випадкові цілі числа від 0 до 9


1335

Як я можу генерувати випадкові цілі числа від 0 до 9 (включно) в Python?

Наприклад, 0, 1, 2, 3, 4, 5, 6, 7, 8,9


15
Хороший стиль вказує на "випадкове" покоління 0-9
ColinMac

Відповіді:


2046

Спробуйте:

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

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

random.randint(a, b)

Поверніть випадкове ціле число N таким, що a <= N <= b.

Документи: 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)]

Це генерує 10 псевдовипадкових цілих чисел у діапазоні від 0 до 9 включно.


63

secretsМодуль нового в Python 3.6. Це краще, ніж randomмодуль для криптографії або використання безпеки.

Щоб випадковим чином надрукувати ціле число в діапазоні включень 0-9:

from secrets import randbelow
print(randbelow(10))

Детальніше див. PEP 506 .


3
Це поліпшило б відповідь і його слід додати. Відповіді, орієнтовані на безпеку, завжди слід додавати, якщо вони є.
SudoKid

30

Виберіть розмір масиву (у цьому прикладі я вибрав розмір 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]])

2
Також корисно знати, як Numpy може генерувати випадковий масив заданого розміру, а не лише одне випадкове число. (Документи: numpy.random.randint )
jkdev

28

Спробуйте це наскрізь random.shuffle

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

Це неправильна відповідь, і її слід видалити.
Ніколя Жерве

21

Я б спробував одне з наступних:

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.uniform та random.randrange . random.randint - найповільніший .

► І np.random.randint, і np.random.uniform набагато швидше (~ 8 - 12 разів швидше), ніж random.randrange та 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)

Примітки:

1.> np.random.randint генерує випадкові цілі числа протягом напіввідкритого інтервалу [низький, високий).

2.> np.random.uniform генерує рівномірно розподілені числа через напіввідкритий інтервал [низький, високий].

3.> random.randrange (стоп) генерує випадкове число з діапазону (початок, зупинка, крок).

4.> random.randint (a, b) повертає випадкове ціле число N таким, що a <= N <= b.

5.> astype (int) кидає масив numpy для типу даних int.

6.> Я вибрав розмір = (15,). Це дасть вам нумерований масив довжиною = 15.


18

У разі безперервних чисел randintабо randrange, мабуть, найкращий вибір, але якщо у вас є кілька чітких значень у послідовності (тобто а list), ви також можете використовувати choice:

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

choice також працює для одного елемента з неперервного зразка:

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

Якщо вам це потрібно "криптографічно сильним", є також secrets.choiceпітон 3.6 і новіші:

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

Що робити, якщо ми хочемо більше чисел із послідовності?
Gunjan naik

Якщо вони повинні бути без заміни: random.sample. З заміною ви можете використовувати розуміння з choice: наприклад, для списку, що містить 3 випадкових значення із заміною:[choice(values) for _ in range(3)]
MSeifert

18

Хоча багато публікацій демонструють, як отримати одне випадкове ціле число, оригінальний питання задає питання про те, як генерувати випадкові цілі числа s (множина):

Як я можу генерувати випадкові цілі числа від 0 до 9 (включно) в Python?

Для наочності тут ми демонструємо, як отримати кілька випадкових цілих чисел.

Дано

>>> 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 Ось кілька варіантів, які стосуються підказки:

  • A : random.randomповертає випадковий поплавок у діапазон[0.0, 1.0)
  • B : random.randintповертає випадкове ціле число Nтаке, щоa <= N <= b
  • С : random.randrangeпсевдонім доrandint(a, b+1)
  • D :random.shuffle переміщує послідовність на місці
  • E :random.choice повертає випадковий елемент з не порожньої послідовності
  • F : random.choicesповертаєтьсяk вибір із сукупності (із заміною, Python 3.6+)
  • G : random.sampleповертає kунікальний вибір із сукупності (без заміни): 2

Дивіться також розмову Р. Хеттінгера про Чункінг і Збудження, використовуючи приклади з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 до вибірки випадкових цілих чисел. 3

Приклади

>>> 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 згадує цей модуль, показуючи одне ціле число. 3 Демонструється @Siddharth Satpathy


14

якщо ви хочете використовувати numpy, тоді використовуйте наступне:

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

1
Ви могли б сказати щось про "нумію".
Сімон

11
Так. Дякуємо за посилання Але я мав на увазі, що ви могли б покращити свою відповідь, надавши детальну інформацію, перш ніж просто навести два рядки коду; наприклад, з якої причини хтось вважає за краще використовувати його замість чогось вже вбудованого. Не так, як ти зобов'язаний.
Сімон

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

Щоб отримати список з десяти зразків:

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

Найкращим способом є використання функції імпорту Random

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

На сторінці документації для випадкового модуля:

Попередження: Псевдовипадкові генератори цього модуля не повинні використовуватися з метою безпеки. Використовуйте os.urandom () або SystemRandom, якщо вам потрібен криптографічно захищений генератор псевдовипадкових чисел.

random.SystemRandom , який був введений в Python 2.4, вважається криптографічно безпечним . Він все ще доступний в 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.digits, rangeможе бути використаний в деяких інших відповідей по можливо , з розумінням. Змішуйте і поєднуйте відповідно до ваших потреб.


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]

Дужки є, тому що 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' або '^! ~ = -> <', щоб змінити пул символів, з якого витягнутись, змінити діапазон, щоб змінити кількість генерованих символів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.