Заполнение и повторное использование случайных чисел Python

Я использую 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-шаблон flask

<!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() не возражает против целого числа, поэтому я использую последнее.

8
задан mikelietz 2 March 2012 в 18:01
поделиться