Código para generar un dígito a la vez

Estoy tratando de hacer generadores de números aleatorios constantes (me refiero a un RNG que genera una serie de números que no se repiten, pero se mantiene igual cada vez que comienza desde el principio). Tengo uno para pi. Necesito un algoritmo para generar e dígito a dígito para alimentar el RNG, preferiblemente en forma de iterador o generador Python. También doy la bienvenida a los códigos que generan otros números irracionales. Gracias por adelantado.

¡Sí! ¡Lo hice con fracción continua!

Encontré estos códigos generando dígitos de raíz cuadrada de 2

def z(contfrac, a=1, b=0, c=0, d=1): for x in contfrac: while a > 0 and b > 0 and c > 0 and d > 0: t = a // c t2 = b // d if not t == t2: break yield t a = (10 * (a - c*t)) b = (10 * (b - d*t)) # continue with same fraction, don't pull new x a, b = x*a+b, a c, d = x*c+d, c for digit in rdigits(a, c): yield digit def rdigits(p, q): while p > 0: if p > q: d = p // q p = p - q * d else: d = (10 * p) // q p = 10 * p - q * d yield d 

Hice el generador de fracciones continuas:

 def e_cf_expansion(): yield 1 k = 0 while True: yield k k += 2 yield 1 yield 1 

y juntarlos

 def e_dec(): return z(e_cf_expansion()) 

Entonces:

 >>> gen = e_dec() >>> e = [str(gen.next()) for i in xrange(1000)] >>> e.insert(1, '.') >>> print ''.join(e) 2. 

Bonificación: Código para generar una fracción continua para sqrt (n) donde n es un entero positivo y sqrt (n) es irracional:

 def sqrt_cf_expansion(S): """Generalized generator to compute continued fraction representation of sqrt(S)""" m = 0 d = 1 a = int(math.sqrt(S)) a0 = a while True: yield a m = d*am d = (Sm**2)//d a = (a0+m)//d 

Si llama a random.seed(n) desde el módulo random con una n conocida, el resultado será el mismo cada vez:

 >>> import random >>> random.seed(4) # chosen by fair dice roll >>> random.randint(0, 9) 2 >>> random.randint(0, 9) 1 >>> random.randint(0, 9) 3 >>> random.randint(0, 9) 1 >>> random.seed(4) # same seed as above >>> random.randint(0, 9) 2 >>> random.randint(0, 9) 1 >>> random.randint(0, 9) 3 >>> random.randint(0, 9) 1 

Si necesita pasar el estado, use la clase Random (poco documentada):

 >>> r = random.Random(4) >>> r.randint(0, 9) 2 >>> r.randint(0, 9) 1 

Es fácil hacer un generador a partir de esto, lo que te permite producir múltiples secuencias que no pisan los dedos de los demás:

 def random_digits(seed): r = random.Random(seed) while True: yield r.randint(0, 9) 

¿Tal vez estás buscando algo como esto?

 >>> import math >>> i = 1 >>> while i < 10: ... print('e = {0:.{1}f}'.format(math.e, i)) ... i += 1 ... e = 2.7 e = 2.72 e = 2.718 e = 2.7183 e = 2.71828 e = 2.718282 e = 2.7182818 e = 2.71828183 e = 2.718281828 

La biblioteca estándar puede darte math.e : la constante matemática e = 2.718281 ..., con la precisión disponible .

Si está dispuesto a usar pi en lugar de e, hay un algoritmo de extracción de dígitos para pi. Se desconoce si existe tal algoritmo para e. El archivo bbp_pi.py en sympy proporciona una buena implementación del algoritmo.