Hướng dẫn 7 cách sử dụng mô-đun random trong Python

1. Nhập Module random
Module random
là một phần của thư viện chuẩn của Python, vì vậy bạn không cần phải cài đặt bất cứ thứ gì. Chỉ cần thêm một dòng đơn giản vào đầu tập lệnh của bạn.
import random
Thế là xong! Bây giờ bạn có thể truy cập tất cả các hàm tạo số ngẫu nhiên mà Python cung cấp.
Đôi khi tôi thích sử dụng cú pháp from random import
khi tôi biết mình sẽ sử dụng các hàm cụ thể lặp đi lặp lại. Bằng cách này, tôi có thể gõ ít hơn khi lập trình.
from random import randint, choice, shuffle
Bây giờ tôi có thể trực tiếp sử dụng randint()
và choice()
mà không cần phải thêm tiền tố random.
vào trước chúng. Đó là một tiện ích nhỏ giúp mã của bạn sạch sẽ hơn khi bạn chỉ sử dụng một vài hàm từ module.
2. Tạo số hoặc phạm vi ngẫu nhiên
Về cơ bản, module random
là về việc tạo ra các số ngẫu nhiên. Nó giống như có xúc xắc kỹ thuật số có thể tung ra các con số trong bất kỳ phạm vi nào bạn có thể tưởng tượng. Ví dụ, nếu bạn muốn tạo số nguyên (whole numbers), bạn sẽ muốn sử dụng hàm randint()
hoặc randrange()
của module random
.
Hàm đầu tiên, random.randint()
, là hoàn hảo khi bạn cần một số nguyên nằm giữa hai điểm, với cả hai điểm cuối đều được bao gồm. Ví dụ:
import random
dice_roll = random.randint(1, 6)
print(f"Bạn đã tung được {dice_roll}!")
Điều này sẽ cung cấp cho bạn một lần tung xúc xắc cổ điển, với các kết quả có thể từ 1 đến 6 bao gồm cả 1 và 6.
Nhưng điều gì sẽ xảy ra nếu bạn cần kiểm soát nhiều hơn, chẳng hạn như chỉ tạo các số lẻ từ 1 đến 10? Đó là lúc hàm thứ hai, random.randrange()
, phát huy tác dụng. Nó hoạt động giống như hàm range()
tích hợp sẵn nhưng trả về một giá trị ngẫu nhiên. Ví dụ:
import random
random_odd = random.randrange(1, 11, 2)
print(f"Số lẻ ngẫu nhiên: {random_odd}")
Mã này sẽ ngẫu nhiên chọn một số lẻ giữa 1 và 10.
Bây giờ, đối với số thập phân (decimal numbers) giữa hai giá trị, bạn có hai lựa chọn tuyệt vời. Lựa chọn đầu tiên là random.random()
, nó cung cấp cho bạn một số thực (float
) giữa và (nhưng không bao giờ thực sự đạt đến ).
import random
chance = random.random()
print(f"Cơ hội thành công là: {chance:.2f}")
Điều này in ra một số dấu phẩy động ngẫu nhiên giữa 0 và 1, mô phỏng xác suất hoặc tỷ lệ phần trăm.
Nếu bạn cần một số thực trong một phạm vi cụ thể, hãy sử dụng hàm random.uniform()
.
import random
temperature = random.uniform(-10.0, 50.0)
print(f"Nhiệt độ mô phỏng: {temperature:.2f}°C")
Điều này có thể xuất ra một cái gì đó như “Nhiệt độ mô phỏng: “, hoàn hảo cho các mô phỏng thời tiết hoặc mô hình khoa học.
3. Chọn ngẫu nhiên một hoặc nhiều phần tử
Nếu bạn đang làm việc với một danh sách các mục, chẳng hạn như tên hoặc tùy chọn, bạn có thể cần chọn một hoặc nhiều mục từ đó. Để chỉ chọn một mục từ một danh sách, hãy sử dụng hàm random.choice(seq)
.
Ví dụ, hãy tạo một tập lệnh Python chọn một màu từ danh sách:
import random
colors = ['red', 'green', 'blue', 'yellow']
print(random.choice(colors))
Điều này hoạt động với bất kỳ chuỗi nào như danh sách, chuỗi ký tự, tuple, thậm chí cả đối tượng range
. Nhưng điều gì sẽ xảy ra nếu bạn cần nhiều hơn một mục? Để chọn nhiều mục, bạn có hai công cụ chính: random.choices(seq, k=n)
và random.sample(seq, k=n)
.
Hàm random.choices()
chọn nhiều mục từ danh sách có thể có sự trùng lặp. Ví dụ:
import random
colors = ['red', 'green', 'blue', 'yellow']
print(random.choices(colors, k=3))
Điều này có thể xuất ra một cái gì đó như ['red', 'red', 'blue']
, trong đó ‘red’ xuất hiện hai lần. Tuy nhiên, nếu bạn muốn các mục duy nhất mà không có sự trùng lặp, hãy sử dụng random.sample()
thay thế:
print(random.sample(colors, k=3))
Ở đây, bạn sẽ nhận được ba màu riêng biệt. Ngoài ra, hãy đảm bảo rằng số lượng bạn yêu cầu (k
) không được lớn hơn chính danh sách đó.
4. Xáo trộn danh sách (thay đổi tại chỗ)
Đôi khi bạn không muốn chọn các mục từ một danh sách, bạn chỉ muốn xáo trộn toàn bộ danh sách. Bạn có thể làm điều đó với hàm random.shuffle()
. Một điều quan trọng cần nhớ là random.shuffle()
sửa đổi danh sách tại chỗ (in place
). Điều này có nghĩa là nó không trả về một danh sách mới, đã được xáo trộn; thay vào đó, nó thay đổi trực tiếp danh sách gốc.
import random
playlist = ['Song A', 'Song B', 'Song C', 'Song D', 'Song E']
random.shuffle(playlist)
print(f"Danh sách phát đã xáo trộn: {playlist}")
Mã này thay đổi danh sách gốc của bạn và không trả về danh sách mới. Đó là lý do tại sao chúng ta truyền danh sách gốc vào hàm print
. Nếu bạn cố gắng gán giá trị trả về của random.shuffle()
cho một biến, nó sẽ trả về None
.
Để giữ cho danh sách gốc của bạn không bị thay đổi, hãy tạo một bản sao trước:
import random
playlist = ['Song A', 'Song B', 'Song C', 'Song D', 'Song E']
copy_playlist = playlist.copy()
random.shuffle(copy_playlist) # Chỉ cần gọi hàm, không cần gán
print('Danh sách đã xáo trộn: ', copy_playlist)
print('Danh sách gốc: ', playlist)
Ở đây, chúng ta tạo một bản sao của danh sách phát gốc, vì vậy việc xáo trộn chỉ ảnh hưởng đến bản sao, giữ cho danh sách gốc không bị động đến.
Nếu danh sách của bạn là bất biến (immutable), như một tuple
, bạn không thể xáo trộn nó trực tiếp. Tuy nhiên, bạn có thể sử dụng hàm sample()
một cách sáng tạo để đạt được hiệu ứng tương tự.
import random
original_tuple = (1, 2, 3, 4, 5)
shuffled_list = random.sample(original_tuple, len(original_tuple))
print(f"Đã xáo trộn thành danh sách: {shuffled_list}")
Mã này chọn tất cả các mục từ tuple
theo thứ tự ngẫu nhiên và trả về chúng dưới dạng một danh sách mới đã được xáo trộn.
5. Tạo mật khẩu hoặc chuỗi ngẫu nhiên
Bạn có thể kết hợp module random
với module string
tích hợp sẵn của Python để tạo ra các mật khẩu ngẫu nhiên mạnh. Ý tưởng là tạo một tập hợp các ký tự bao gồm chữ cái, số và ký hiệu, sau đó sử dụng random.choices()
để chọn các ký tự một số lần nhất định.
Đây là một hàm tạo mật khẩu đơn giản:
import string
import random
def gen_password(length=12):
# Tập hợp tất cả các ký tự có thể: chữ cái, số, ký hiệu
characters = string.ascii_letters + string.digits + string.punctuation
# Chọn ngẫu nhiên k=length ký tự và nối chúng lại thành chuỗi
password = ''.join(random.choices(characters, k=length))
return password
print(f"Mật khẩu mới của bạn: {gen_password()}")
Trong đó:
string.ascii_letters
cung cấp tất cả các chữ cái in hoa và in thường.string.digits
cung cấp các số từ 0 đến 9.string.punctuation
thêm các ký tự đặc biệt.
Chúng ta nhóm tất cả các ký tự này thành một tập hợp lớn hơn và sử dụng random.choices()
để chọn số lượng cần thiết. Đối với các trường hợp đơn giản hơn như tạo mã xác minh hoặc PIN, bạn có thể giới hạn lựa chọn chỉ là các chữ số.
def generate_pin(length=6):
digits = string.digits
return ''.join(random.choices(digits, k=length))
print(f"Mã PIN xác minh của bạn: {generate_pin()}")
Mã này tạo ra một mã PIN số gồm sáu chữ số ngẫu nhiên, lý tưởng cho các hệ thống xác thực đơn giản hoặc dữ liệu thử nghiệm.
6. Làm việc với tính ngẫu nhiên có trọng số
Đôi khi bạn không muốn mọi lựa chọn ngẫu nhiên đều có cơ hội xảy ra ngang nhau. Ví dụ, trong một số chương trình, một số kết quả nên xảy ra thường xuyên hơn những kết quả khác. Đó là lúc tính ngẫu nhiên có trọng số phát huy tác dụng.
Hàm random.choices()
của Python cho phép bạn gán các xác suất khác nhau cho mỗi tùy chọn bằng cách sử dụng tham số weights
, cho phép bạn làm cho một số kết quả có nhiều khả năng xảy ra hơn.
Đây là một ví dụ mà một số giải thưởng trong trò chơi hiếm hơn những giải khác:
import random
prizes = ['gold', 'silver', 'bronze']
weights = [0.6, 0.3, 0.1] # Tỷ lệ cơ hội tương đối (60%, 30%, 10%)
winner = random.choices(prizes, weights=weights, k=1)[0]
print(winner)
Trong ví dụ này, vàng có cơ hội được chọn cao nhất (60%), bạc ít hơn (30%), và đồng là hiếm (10%). Cách tiếp cận này giúp các vật phẩm phổ biến xuất hiện thường xuyên hơn trong khi vẫn giữ cho các vật phẩm hiếm trở nên đặc biệt.
Bạn cũng có thể sử dụng trọng số tích lũy (cumulative weights
), đại diện cho tổng xác suất đang chạy. Điều này có thể hiệu quả hơn đối với các tập dữ liệu lớn.
import random
loot_value = ['common', 'uncommon', 'rare', 'legendary']
cumulative_weights = [70, 90, 99, 100]
# Tích lũy của [70, 20, 9, 1]
# common: 70/100, uncommon: 20/100 (90-70), rare: 9/100 (99-90), legendary: 1/100 (100-99)
random_loot = random.choices(loot_value, cum_weights=cumulative_weights, k=1)[0]
print(f"Bạn đã tìm thấy vật phẩm {random_loot}!")
Kết quả là phân phối xác suất tương tự như trước, nhưng trọng số tích lũy được xử lý nhanh hơn, đặc biệt với các danh sách dài. Sự khác biệt chính giữa trọng số thông thường và trọng số tích lũy là trọng số thông thường đại diện cho xác suất riêng lẻ của từng mục, trong khi trọng số tích lũy đại diện cho tổng xác suất đang chạy cho đến từng mục.
7. Đặt Seed ngẫu nhiên để có kết quả có thể tái tạo
Module random
cung cấp sự không thể đoán trước khi bạn cần, nhưng nó cũng cho phép khả năng tái tạo (reproducibility). Mặc dù điều đó nghe có vẻ lạ, nhưng nó rất quan trọng cho việc thử nghiệm, gỡ lỗi và các mô phỏng khoa học.
Máy tính không tạo ra sự ngẫu nhiên thực sự; chúng tạo ra số giả ngẫu nhiên dựa trên một công thức toán học bắt đầu bằng một giá trị gọi là seed. Nếu bạn sử dụng cùng một seed, bạn sẽ luôn nhận được cùng một chuỗi số ngẫu nhiên.
Hãy đặt seed bằng random.seed()
với tập lệnh này:
import random
# Đặt một seed cụ thể
random.seed(42)
print(random.randint(1, 100)) # Luôn in ra 82
print(random.randint(1, 100)) # Luôn in ra 15
Chạy lại tập lệnh với cùng một seed, và bạn sẽ nhận được các kết quả giống nhau.
Tính dự đoán này cực kỳ hữu ích cho việc thử nghiệm và xác định các lỗi không thể đoán trước. Hơn nữa, khi không có seed nào được đặt, Python sử dụng entropy do hệ thống tạo ra (như thời gian hiện tại) để tạo ra các kết quả khác nhau mỗi lần chạy.
8. Tạo ngày và giờ ngẫu nhiên
Module random
không trực tiếp tạo ra ngày hoặc giờ, nhưng khi bạn kết hợp nó với module datetime
của Python, nó trở thành một công cụ có giá trị để tạo dữ liệu thử nghiệm thực tế.
Ý tưởng rất đơn giản: xác định một ngày bắt đầu và ngày kết thúc, tính toán khoảng thời gian giữa chúng, và sau đó chọn một điểm ngẫu nhiên trong phạm vi đó.
from datetime import date, timedelta
import random
start_date = date(2023, 1, 1)
end_date = date(2023, 12, 31)
time_between = end_date - start_date
days_between = time_between.days
random_days = random.randrange(days_between)
random_date = start_date + timedelta(days=random_days)
print(f"Đây là một ngày ngẫu nhiên trong năm 2023: {random_date}")
Tập lệnh này tính tổng số ngày giữa hai ngày, chọn một số ngày ngẫu nhiên trong phạm vi đó và cộng nó vào ngày bắt đầu. Hơn nữa, nếu bạn cần các dấu thời gian ngẫu nhiên (với giờ, phút và giây), bạn cũng có thể làm việc với giây thay vì ngày.
from datetime import datetime, timedelta
import random
start = datetime(2023, 1, 1)
end = datetime(2023, 12, 31)
delta = end - start
# Lấy tổng số giây
random_seconds = random.randint(0, int(delta.total_seconds()))
random_timestamp = start + timedelta(seconds=random_seconds)
print(f"Dấu thời gian ngẫu nhiên: {random_timestamp}")
Bạn cũng có thể phát triển ý tưởng này hơn nữa và xây dựng một trình tạo dữ liệu đơn giản. Nó hoàn hảo để tạo các bộ dữ liệu giả lập (mock datasets) có cảm giác chân thực. Cho dù là tạo thời gian đăng nhập ngẫu nhiên, dữ liệu thời tiết hay lịch sử sự kiện, việc kết hợp random
với datetime
sẽ thêm một lớp không thể đoán trước, nhận biết thời gian thực tế vào các dự án của bạn.
Python bao gồm một bộ sưu tập ấn tượng các thư viện và module giúp đơn giản hóa nhiều tác vụ trong thế giới thực. Cho dù bạn đang tự động hóa việc quản lý tệp hay phân tích các bộ dữ liệu lớn, luôn có một module được thiết kế để làm cho công việc của bạn dễ dàng và nhanh chóng hơn.
9. Kết luận
Mô-đun random trong Python là một công cụ linh hoạt và mạnh mẽ, và 7 cách sử dụng được hướng dẫn trong bài viết đã minh chứng khả năng của nó trong việc tạo số ngẫu nhiên, xáo trộn dữ liệu hay mô phỏng các tình huống thực tế. Từ phát triển trò chơi, phân tích dữ liệu đến tạo các ứng dụng sáng tạo, random giúp bạn thêm yếu tố bất ngờ và hiệu quả vào mã nguồn. Hy vọng bài viết này đã giúp bạn làm chủ mô-đun này, sẵn sàng khai thác tiềm năng của Python để tạo ra những dự án độc đáo và thú vị hơn bao giờ hết!
Xem thêm: Hướng dẫn cách cài đặt Windows 11 không cần bloatware trên phần cứng không được hỗ trợ
Hãy ghé qua COHOTECH để khám phá các laptop, PC cấu hình mạnh hoặc phụ kiện công nghệ chất lượng cao, hỗ trợ lập trình Python mượt mà với mô-đun random. Với đội ngũ chuyên gia tận tâm và dịch vụ hỗ trợ kỹ thuật chuyên nghiệp, COHOTECH cam kết mang đến giải pháp tối ưu và những ưu đãi hấp dẫn để bạn chinh phục mọi thử thách lập trình. Theo dõi chúng tôi để cập nhật thêm nhiều mẹo công nghệ hữu ích và sản phẩm độc quyền!
Bạn đã sử dụng mô-đun random trong Python cho dự án nào chưa? Hãy chia sẻ kinh nghiệm hoặc đặt câu hỏi trong phần bình luận bên dưới nhé! Nếu bài viết này hữu ích, đừng quên like, share và lan tỏa đến bạn bè để cùng khám phá sức mạnh của Python. Cảm ơn bạn đã đọc và hẹn gặp lại!