2012-03-02 3 views
7

파이썬과 플라스크를 사용하여 무작위 게임 보드를 표시하고 종자를 사용하여 동일한 게임으로 돌아갈 수있게하려고합니다.파이썬 무작위 종자 씨앗 뿌리기 및 재사용

그러나 임의의 시드를 사용하든 시드를 지정하든 동일한 의사 랜덤 시퀀스를 얻는 것처럼 보입니다.

대다수의 코드를 잘라내었지만 (아래의 코드는 쪼개지 않고 numpy로 결합했습니다.) 간단한 코드는 버그를 보여줍니다 : 폼에 어떤 seed 값을 주 었는지에 관계없이 제출시 표시되는 숫자 는 똑같은. 시드를 지정하지 않고 양식을 제출하면 다른 번호가 표시되지만 다시로드 할 때 시드 값이 다르더라도 다른 번호는 항상 동일합니다.

씨 뿌리기에 문제가 있습니까? 여기

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> 

내가 곱 더 기억에 남는 값을 제공 할 수 있도록 10 만하여 씨앗을 분할 (예를 들어, 4231 대신 4.231479094의 ...)입니다. 사용 가능한 정수 시드 값을 갖는 더 좋은 방법이 있습니까?

업데이트 : 예, 정수 나누기를 수행하는 더 좋은 방법은 있습니다. 전혀 나누지 않는 것이 좋습니다. 당분간 이것은 내가하고있는 일이다 :

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

당신의 시드는 아마 정수와 정수로 나눌 수 있습니다. 초기 파이썬에서는 float를주지 않습니다.

np.random.seed(seed) 

씨는 변경해야합니다 : 씨앗 <이와 100000 경우에 따라서

7078/100000 = 0 

이 항상 0의 씨앗을 제공합니다. 인수가 없으면 np.random.seed은 (시스템 종속적) 시드를 취해야합니다.

이 부분을 "수정"하는 PIP를 읽으려면 PEP 238을 참조하십시오. Python 3에서는이 2/5=0.4 in Python 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

내 실수에 대해 너무 작은 깊이의 목적은, 내가 고칠 수 있습니다. numpy seed가 float을 취한 것으로 생각했습니다. int가 필요합니다. http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.mtrand.RandomState.html – Hooked

+0

강제로 부동 소수점을 상속 받아 전환하면 랜덤 (np.random이 아닌)을 사용하면 원래의 100000 값으로 작동합니다. np.random 대신 random을 사용하지 않는 이유가 있을까요? – mikelietz