我正在使用Python和Flask来显示一个随机游戏板,并尝试让人们使用种子返回同一个游戏。
但是,无论我使用随机种子还是指定种子,我似乎都得到了相同的伪随机序列。
我删除了大部分代码(我做了很多分裂并加入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而不是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()并不介意整数,所以我使用的是后者。
答案 0 :(得分:6)
你的种子可能是一个整数,早期Python中的整数除法不会给出浮点数。因此
7078 / 100000 = 0
如果种子是&lt;种子,则总是给出零种子。 100000.有了这个:
np.random.seed( seed )
种子应该改变。没有参数np.random.seed
应该尝试采用(系统相关的)种子。
如果您想阅读PIP“修复”该部门:请参阅PEP 238。在Python 3中,这是{2.}}在Python 2.X 2/5=0.4
中。您可以通过包含以下行来强制在代码顶部浮点向上转换:
2/5=0
为什么使用from __future__ import division
代替Python的np.random
?
Python stdlib模块“random”还包含一个Mersenne Twister伪随机数生成器,其中包含许多与RandomState中可用的方法类似的方法。除了NumPy感知之外,RandomState的优势在于它提供了更多的概率分布可供选择。