Bài tập

Làm việc với Số ngẫu nhiên trong Python

Huy Erick

Tạo Số Float Ngẫu Nhiên trong khoảng từ 0.0 đến 1.0 Hàm random.random() trả về một số float ngẫu nhiên trong khoảng [0.0, 1.0). Điều này có nghĩa là số ngẫu nhiên sẽ luôn nhỏ...

Tạo Số Float Ngẫu Nhiên trong khoảng từ 0.0 đến 1.0

Hàm random.random() trả về một số float ngẫu nhiên trong khoảng [0.0, 1.0). Điều này có nghĩa là số ngẫu nhiên sẽ luôn nhỏ hơn 1.0:

import random  random.random() # 0.11981376476232541 random.random() # 0.757859420322092 random.random() # 0.7384012347073081

Tạo Số nguyên Ngẫu Nhiên giữa x và y

Để tạo một số nguyên ngẫu nhiên giữa hai điểm đầu mút trong Python, ta sử dụng hàm random.randint(). Hàm này bao gồm cả khoảng [x, y]:

import random  random.randint(1, 10) # 10 random.randint(1, 10) # 3 random.randint(1, 10) # 7

Nếu bạn muốn loại trừ điểm đầu mút bên phải, bạn có thể sử dụng hàm random.randrange(). Kết quả sẽ nằm trong khoảng [x, y) và luôn nhỏ hơn y:

import random  random.randrange(1, 10) # 5 random.randrange(1, 10) # 3 random.randrange(1, 10) # 4

Tạo Số Float Ngẫu Nhiên trong khoảng từ x đến y

Nếu bạn cần tạo các số float ngẫu nhiên nằm trong khoảng [x, y], bạn có thể sử dụng hàm random.uniform:

import random  random.uniform(1, 10) # 7.850184644194309 random.uniform(1, 10) # 4.00388600011348 random.uniform(1, 10) # 6.888959882650279

Chọn ngẫu nhiên một phần tử từ danh sách

Để chọn ngẫu nhiên một phần tử từ một danh sách (list hoặc tuple), bạn có thể sử dụng hàm random.choice:

import random  items = ['một', 'hai', 'ba', 'bốn', 'năm'] random.choice(items) # 'năm' random.choice(items) # 'một' random.choice(items) # 'bốn'

Nếu danh sách trống, sẽ ném ra một lỗi IndexError.

Ngẫu nhiên hóa một danh sách

Để ngẫu nhiên hóa một danh sách, ta sử dụng hàm random.shuffle. Hàm này sẽ thay đổi thứ tự các phần tử trong danh sách:

import random  items = ['một', 'hai', 'ba', 'bốn', 'năm'] random.shuffle(items) items # ['ba', 'năm', 'ba', 'một', 'hai']

Nếu bạn không muốn thay đổi danh sách gốc, bạn cần tạo một bản copy trước đó và sau đó thực hiện việc ngẫu nhiên hóa trên bản copy. Bạn có thể tạo bản copy của các đối tượng Python bằng module copy.

Chọn n mẫu ngẫu nhiên từ danh sách

Để chọn một mẫu ngẫu nhiên gồm n phần tử từ một danh sách, ta sử dụng hàm random.sample:

import random  items = ['một', 'hai', 'ba', 'bốn', 'năm'] random.sample(items, 3) # ['một', 'năm', 'hai'] random.sample(items, 3) # ['năm', 'ba', 'hai'] random.sample(items, 3) # ['ba', 'hai', 'năm']

Tạo Số ngẫu nhiên An toàn về mặt mã hóa

Nếu bạn cần tạo các số ngẫu nhiên được an toàn về mặt mã hóa cho mục đích bảo mật, hãy sử dụng random.SystemRandom - một class sử dụng bộ sinh số giả ngẫu nhiên mã hóa.

Các instance của class SystemRandom cung cấp các hàm tạo số ngẫu nhiên tương tự như module random:

import random  rand_gen = random.SystemRandom() rand_gen.random() # 0.6112441459034399 rand_gen.randint(1, 10) # 2 rand_gen.randrange(1, 10) # 5 rand_gen.uniform(1, 10) # 8.42357365980016 rand_gen.choice('abcdefghijklmn') # 'j'  items = ['một', 'hai', 'ba', 'bốn', 'năm'] rand_gen.shuffle(items) items # ['hai', 'một', 'ba', 'năm', 'bốn']  rand_gen.sample('abcdefghijklmn', 3) # ['g', 'e', 'c']

Module secrets trong Python 3.6+

Nếu bạn đang sử dụng Python 3 và cần tạo các số ngẫu nhiên an toàn về mặt mã hóa, hãy thử module secrets. Module này đã có sẵn trong Python 3.6:

import secrets  # Tạo token an toàn về mặt mã hóa: secrets.token_bytes(16) # b'xc4xf4xacx9ex07xb2xdcx07x87xc8 xdfx17x85^{'  secrets.token_hex(16) # 'a20f016e133a2517414e0faf3ce4328f'  secrets.token_urlsafe(16) # 'eEFup5t7vIsoehe6GZyM8Q'  # Chọn ngẫu nhiên một phần tử từ một chuỗi: secrets.choice('abcdefghij') # 'h'  # So sánh hai chuỗi an toàn về mặt mã hóa # (Giảm rủi ro của các cuộc tấn công dựa trên thời gian): secrets.compare_digest('abcdefghij', '123456789') # False secrets.compare_digest('123456789', '123456789') # True

Nguồn: https://dbader.org/blog/python-random-numbers

1