Hola, estoy tratando de obtener un generador de números aleatorios uniforme utilizando un algoritmo criptográfico como motor. Se puede usar DES, pero en este caso he usado TEA de acuerdo con este http: // myweb.tiscali.co.uk/jgrimbleby/random.htm portando el código de c ++ a python. El problema que tengo es que necesito que el rango esté entre 0 y 1. Actualmente, los valores que obtengo son muy grandes 10 ^ 76 rango. Cualquier idea si es un error de transcripción de mi parte o si hay alguna adición que pueda agregar para obtener el rango deseado.

class psrTEA:

def __init__(self):

    self.m = 4294967296.0
    self.d = 0X09E3779B9L
    self.k0 = 0X0C7D7A8B4L
    self.k1 = 0X09ABFB3B6L
    self.k2 = 0X073DC1683L
    self.k3 = 0X017B7BE73L

    self.y = 123456789L
    self.z = 987654321L

def rnd(self):
    s = 0
    self.y = long(time.time())
    self.z = long(time.clock())

    for n in range(31):
        s += self.d
        self.y += (self.z << 4) + self.k0 ^ self.z + s ^ (self.z >> 5) + self.k1
        self.z += (self.y << 4) + self.k2 ^ self.y + s ^ (self.y >> 5) + self.k3

    return ((self.z + self.y / self.m)/ self.m)
0
arm1 11 abr. 2012 a las 03:12

1 respuesta

La mejor respuesta

Calcule su valor más alto (o calcule muchos valores, tome el máximo, tal vez adivine un poco en función de una potencia de 2 o algo así).

Luego, divida cada uno de sus grandes resultados por una versión flotante del valor más alto. Eso debería escalar las cosas a 0..1.

1
user1277476 11 abr. 2012 a las 04:32
Gracias, cambié mi valor de m anterior para reflejar que ya que el valor anterior era un poco demasiado pequeño
 – 
arm1
19 abr. 2012 a las 00:39