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