2012-03-02 34 views
7

Tôi đang sử dụng Python và Flask để hiển thị bảng trò chơi ngẫu nhiên và cố gắng cho phép mọi người quay lại cùng một trò chơi bằng cách sử dụng hạt giống.Giống và sử dụng lại các hạt giống ngẫu nhiên của Python

Tuy nhiên, liệu tôi có sử dụng hạt giống ngẫu nhiên hay chỉ định hạt giống, tôi dường như có cùng chuỗi giả ngẫu nhiên.

Tôi cắt phần lớn mã của mình (tôi làm rất nhiều việc chia nhỏ và tham gia với numpy) nhưng ngay cả mã đơn giản dưới đây cũng hiển thị lỗi: bất kể giá trị của hạt giống tôi cung cấp biểu mẫu, số được hiển thị khi gửi là giống nhau. Việc gửi biểu mẫu mà không chỉ định hạt giống sẽ hiển thị một số khác, nhưng mặc dù hiển thị các giá trị hạt giống khác nhau khi tải lại, số khác đó luôn giống nhau.

Tôi có làm gì sai khi gieo hạt không?

from flask import Flask, request, render_template 
import numpy as np 
import random 

app = Flask(__name__) 

@app.route('/') 
def single_page(): 
    return render_template('page.html', title = 'empty form') 

@app.route('/number', methods = [ 'POST', 'GET' ]) 
def render_page(title = 'generated random number', error = []): 
    error = [] 
    if request.method == 'POST': 
     if request.form['seed'].isdigit(): 
     seed = int(request.form['seed']) 
     error.append("seed set: " + str(seed) + ".") 
     np.random.seed(seed/100000) 
     else: 
     seed = int(100000 * random.random()) 
     error.append("seed not set, " + str(seed) + " instead.") 
     np.random.seed(seed/100000) 

     n = np.random.random() * 100; 

     return render_template('page.html', title=title, error=error, n=n, seed=seed) 

    else: 
     return render_template('page.html', title = 'empty form') 

if __name__ == '__main__': 
    app.debug = True 
    app.run() 

Dưới đây là các mẫu bình HTML

<!doctype html> 
<html> 
<head><title>{{title}}</title> 
</head> 
<body> 
{% if error != '' %} 
{% for message in error %} 
    <h2>{{message}}</h2> 
{% endfor %} 
{% endif %} 

{% if n %} 
    <h2>Random number is {{n}}</h2> 

    <h6>seed = {{ seed }}</h6> 
{% else %} 
    <div id="form"> 
    <form id="the_form" method="POST" action="number"> 
    Seed: <input type="number" min="1" max="99999" id="seed" name="seed"><br> 
    <button id="submit" type="submit">Submit</button> 
    </form> 
{% endif %} 
</div> 
</body> 
</html> 

tôi nhân và chia các hạt bằng 100.000 để cung cấp cho một giá trị đáng nhớ hơn (ví dụ 4231 thay vì 4,231479094 ...). Có cách nào tốt hơn để có giá trị hạt giống số nguyên có thể sử dụng không?

CẬP NHẬT: Có, có cách tốt hơn để thực hiện giá trị số nguyên - không gây rối với việc chia đều. Trong thời gian này là những gì tôi đang làm:

import numpy as np 
import random 
. 
. 
. 
     if request.form['seed'].isdigit(): 
     seed = int(request.form['seed']) 
     error.append("seed set: " + str(seed) + ".") 
     random.seed(seed) 
     else: 
     seed = int(100000 * np.random.random()) 
     error.append("seed not set, " + str(seed) + " instead.") 
     random.seed(seed) 

     n = random.random() * 100; 

     return render_template('page.html', title=title, error=error, n=n, seed=seed) 

Điều này làm việc tốt. np.random.seed() dường như không nhận được cùng một chuỗi, nhưng random.seed() không quan tâm đến một số nguyên, vì vậy tôi đang sử dụng số nguyên.

Trả lời

6

Hạt giống của bạn có lẽ là một phân số nguyên và số nguyên trong Python ban đầu sẽ không cung cấp một phao. Như vậy

7078/100000 = 0 

này luôn mang đến cho một hạt giống của zero nếu hạt giống là < 100000. Với điều này:

np.random.seed(seed) 

Hạt giống nên thay đổi. Không có đối số np.random.seed nên cố gắng lấy một hạt giống (phụ thuộc vào hệ thống).

Nếu bạn muốn đọc trên PIP "sửa lỗi" phần này: xem PEP 238. Trong Python 3, 2/5=0.4 bằng Python 2.X 2/5=0. Bạn có thể buộc floating point upcasting ở phía trên cùng của mã của bạn bằng cách bao gồm các dòng:

from __future__ import division 

Tại sao sử dụng np.random thay vì Python của random?

Từ documentation:

The Python stdlib module “random” also contains a Mersenne Twister pseudo-random number generator with a number of methods that are similar to the ones available in RandomState. RandomState, besides being NumPy-aware, has the advantage that it provides a much larger number of probability distributions to choose from.

+0

Khi tôi cố gắng dòng đó, tôi nhận được ValueError: đối tượng có chiều sâu quá nhỏ so với mảng mong muốn – mikelietz

+0

Sai lầm của tôi, tôi sẽ sửa chữa. Tôi nghĩ rằng hạt giống numpy mất một phao, phải mất một int: http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.mtrand.RandomState.html – Hooked

+0

Nếu tôi buộc nổi điểm upcasting, và chuyển đổi để sử dụng ngẫu nhiên (không phải np.random) thì nó hoạt động với giá trị 100000 ban đầu. Sẽ có bất kỳ lý do gì * không * để sử dụng ngẫu nhiên thay vì np.random? – mikelietz

Các vấn đề liên quan