सीडिंग और पुन: उपयोग करना मैं एक यादृच्छिक गेम बोर्ड प्रदर्शित करने के लिए पाइथन और फ्लास्क का उपयोग कर रहा हूं, और लोगों को बीज का उपयोग करके उसी गेम में लौटने की अनुमति देने की कोशिश कर रहा हूं।पाइथन यादृच्छिक बीज
हालांकि, चाहे मैं यादृच्छिक बीज का उपयोग करता हूं, या बीज निर्दिष्ट करता हूं, मुझे लगता है कि मुझे एक ही छद्म यादृच्छिक अनुक्रम मिलते हैं।
मैंने अपने अधिकांश कोड को काट दिया (मैं बहुत सारे विभाजन और numpy के साथ शामिल हो रहा है) लेकिन यहां तक कि नीचे दिया गया सरल कोड भी बग दिखाता है: इससे कोई फर्क नहीं पड़ता कि मैं किस बीज का फॉर्म देता हूं, जमा करने पर प्रदर्शित संख्या एक ही है। बीज निर्दिष्ट किए बिना फॉर्म जमा करने से एक अलग संख्या दिखाई देती है, लेकिन पुनः लोड करने पर विभिन्न बीज मूल्यों को दिखाने के बावजूद, वह अन्य नंबर हमेशा समान होता है।
क्या मैं बीजिंग के साथ कुछ गलत कर रहा हूं?
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()
यहाँ कुप्पी 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>
मैं गुणा और 100,000 से बीज विभाजित इतनी के रूप में एक और अधिक यादगार मूल्य देने के लिए (जैसे कि, 4231 ४.२३,१४,७९,०९४ के बजाय ...) है। क्या उपयोग करने योग्य पूर्णांक बीज मान रखने का एक बेहतर तरीका है?
अद्यतन: हां, पूर्णांक बीज मान करने का एक बेहतर तरीका है - बिल्कुल विभाजित करने के साथ गड़बड़ नहीं। इस समय के लिए मैं यह कर रहा हूं:
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)
यह ठीक काम करता है। np.random.seed() हमेशा एक ही अनुक्रम प्राप्त नहीं कर रहा था, लेकिन random.seed() एक पूर्णांक को ध्यान में रखता नहीं है, इसलिए मैं बाद वाले का उपयोग कर रहा हूं।
जब मैं उस लाइन की कोशिश, मैं ValueError मिलती है: वांछित सरणी – mikelietz
मेरे गलती के लिए बहुत छोटा गहराई की वस्तु है, मैं ठीक कर देंगे। मैंने सोचा कि नुकीले बीज ने एक फ्लोट लिया है, यह एक int लेता है: http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.mtrand.RandomState.html – Hooked
यदि मैं फ़्लोटिंग पॉइंट अपकास्टिंग को बल देता हूं, और स्विच करता हूं यादृच्छिक (np.random नहीं) का उपयोग करने के लिए यह मूल 100000 मान के साथ काम करता है। Np.random के बजाए यादृच्छिक उपयोग करने के लिए कोई कारण नहीं * होगा *? – mikelietz