【问题标题】:Seeding and reusing Python random seeds播种和重用 Python 随机种子
【发布时间】:2012-03-02 14:02:16
【问题描述】:

我正在使用 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() 不介意整数,所以我使用后者。

【问题讨论】:

    标签: python random flask


    【解决方案1】:

    您的种子可能是整数,而早期 Python 中的整数除法不会给出浮点数。因此

    7078 / 100000 = 0
    

    如果种子

    np.random.seed( seed )
    

    种子应该改变。如果没有参数 np.random.seed 应该尝试获取(系统相关的)种子。

    如果您想了解“修复”此划分的 PIP:请参阅 PEP 238。在 Python 3 中,此 2/5=0.4 在 Python 2.X 中 2/5=0。您可以通过包含以下行来强制在代码顶部进行浮点向上转换:

    from __future__ import division
    

    为什么使用 np.random 而不是 Python 的 random

    来自documentation

    Python stdlib 模块“random”还包含一个 Mersenne Twister 伪随机数生成器,其中包含许多与 RandomState 中可用的方法相似的方法。 RandomState 除了支持 NumPy 之外,还具有提供更多概率分布可供选择的优势。

    【讨论】:

    • 当我尝试该行时,我得到 ValueError: object of too small depth for desired array
    • 我的错误,我会改正的。我以为 numpy 种子需要一个浮点数,它需要一个 int:docs.scipy.org/doc/numpy/reference/generated/…
    • 如果我强制浮点向上转换,并切换到使用随机(不是 np.random),那么它适用于原始的 100000 值。是否有任何理由使用 random 而不是 np.random?
    • @mikelietz random 接受任何 hashable 对象(因此在这里可以使用浮点数),其中 np.random 专门接受一个 int 对象。从头到尾,我不知道这两个生成器之间的区别。
    • 由于 np.random.seed() 使用整数,我不再需要除以 100000 了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多