Hỏi về random trong Python

Chào anh em.

Mới đây thằng cu bạn em mới làm một mini game nhỏ theo kiểu nhập số - xem kết quả: http://ideone.com/dt4fZF

Em đã thử chạy bằng Code::Block và thấy rằng, mặc dù nhập cùng một giá trị, nhưng cứ mỗi lần Run code, thì kết quả đưa ra màn hình lại khác nhau. Em đoán là do thằng này (bên trong code):

mt19937_64 randomGenerator(time(NULL));
uniform_int_distribution<int> hATK(0, 40);
uniform_int_distribution<int> oATK(0, 50);

Em không hiểu nhiều lắm về hàm này trong C++, vì em học Python mà.

SAu đó, em “translate” code của thằng bạn ra Python:

Và mặc dù chạy rất nhiều lần bằng lệnh python trong Terminal

~$ python  <tên file>.py

Thì kết quả hiện ra màn hình của code Python này vẫn giống ý như nhau, với cùng một giá trị nhập vào :crying_cat_face:

Vậy thì cái này

mt19937_64 randomGenerator(time(NULL));
uniform_int_distribution<int> hATK(0, 40);
uniform_int_distribution<int> oATK(0, 50);

là chi? Và làm sao “translate” nó ra Python đây ạ? :blush:

Em cảm ơn ạ :wink:

em import random rồi xài random.randint(a,b) là được

uniform_int_distribution<int> hATK(0, 40) là để lấy số ngẫu nhiên trong đoạn [0,40] mỗi khi gọi hATK(andomGenerator) (từ 0 tới 40 có 41 số, và 41 số này có xác suất chọn tương đương nhau, nên gọi là “uniform distribution”)

với Python thì gọi random.randint(0, 40) thay cho hATK(andomGenerator). Khỏi cần tạo random generator hay hATK gì hết, thư viện random nó lo hết rồi.

3 Likes

Vậy làm sao để em nhận được giá trị random không cố định mỗi khi mở file chứa code qua Terminal ạ?
Ví dụ: Em nhập số Human là: 3 , và số Orcs cũng là: 3.
Cứ mỗi lần chạy code với cặp giá trị 3 - 3 này, thì chỉ có duy nhất một diễn biến trên màn hình. Dù em có chạy code bao nhiu lần nữa? ::persevere:

Việc đầu tiên là print 2 cái biến hATKoATK để “minh oan” cho cái hàm randint :V hàm này không thể sai được. Sau đó thì debug cái đống bên dưới, print hết các biến ra để theo dõi xem có thằng nào không đúng thì xử lí. Chứ debug kiểu chạy đi chạy lại chờ nó đúng thì … cùy :joy:

Chán print rồi có thể dùng cách này để debug:

python -m pdb test.py
(Gõ ? để xem hướng dẫn)

Hoặc đặt import pdb;pdb.set_trace() ở vị trí muốn dừng lại

3 Likes

hATK = random.randint(0,40)
để ở dòng
hATKp = hATK(randomGenerator);
trong vòng for ấy. Ai lại đi để ở ngoài vòng for?

    hATK = random.randint(0,40)
    oATK = random.randint(0,50)
# your true face
    while hNum != 0 and oNum != 0:
        combatEnd = False    
        hHP = 155
        oHP = 80
        while combatEnd == False:
            hATKp = hATK
            oATKp = oATK

thành

# your true face
    while hNum != 0 and oNum != 0:
        combatEnd = False    
        hHP = 155
        oHP = 80
        while combatEnd == False:
            hATK = random.randint(0,40)
            oATK = random.randint(0,50)
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?