2012-03-02 15 views
7

सीडिंग और पुन: उपयोग करना मैं एक यादृच्छिक गेम बोर्ड प्रदर्शित करने के लिए पाइथन और फ्लास्क का उपयोग कर रहा हूं, और लोगों को बीज का उपयोग करके उसी गेम में लौटने की अनुमति देने की कोशिश कर रहा हूं।पाइथन यादृच्छिक बीज

हालांकि, चाहे मैं यादृच्छिक बीज का उपयोग करता हूं, या बीज निर्दिष्ट करता हूं, मुझे लगता है कि मुझे एक ही छद्म यादृच्छिक अनुक्रम मिलते हैं।

मैंने अपने अधिकांश कोड को काट दिया (मैं बहुत सारे विभाजन और 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() एक पूर्णांक को ध्यान में रखता नहीं है, इसलिए मैं बाद वाले का उपयोग कर रहा हूं।

उत्तर

6

आपका बीज शायद पाइथन में एक पूर्णांक और पूर्णांक विभाजन नहीं होगा। इस प्रकार

7078/100000 = 0 

यह हमेशा शून्य के बीज देता है अगर बीज इस के साथ < 100000 है:

np.random.seed(seed) 

बीज बदलना चाहिए। एक तर्क के बिना np.random.seed एक (सिस्टम-निर्भर) बीज लेने की कोशिश करनी चाहिए।

यदि आप पीआईपी पर पढ़ना चाहते हैं जो इस विभाजन को "ठीक करता है": PEP 238 देखें। पाइथन 3 में यह 2/5=0.4 पायथन 2.X 2/5=0 में।

from __future__ import division 

क्यों np.random पायथन के random के बजाय का उपयोग करें: आप शामिल करके चल अपने कोड के शीर्ष पर बिंदु upcasting मजबूर कर सकते हैं?

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

जब मैं उस लाइन की कोशिश, मैं ValueError मिलती है: वांछित सरणी – mikelietz

+0

मेरे गलती के लिए बहुत छोटा गहराई की वस्तु है, मैं ठीक कर देंगे। मैंने सोचा कि नुकीले बीज ने एक फ्लोट लिया है, यह एक int लेता है: http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.mtrand.RandomState.html – Hooked

+0

यदि मैं फ़्लोटिंग पॉइंट अपकास्टिंग को बल देता हूं, और स्विच करता हूं यादृच्छिक (np.random नहीं) का उपयोग करने के लिए यह मूल 100000 मान के साथ काम करता है। Np.random के बजाए यादृच्छिक उपयोग करने के लिए कोई कारण नहीं * होगा *? – mikelietz

संबंधित मुद्दे