V8 JavaScript Solutions (¡Increíble!) Generador de números aleatorios

Según esta publicación en el blog oficial de V8 Javascript, el generador de números pseudoaleatorios (PRNG) que utiliza V8 Javascript en Math.random() es terriblemente defectuoso y está siendo reemplazado por algo mucho mejor. V8 es el motor Javascript rápido de Google que desarrollaron para Chrome y se usa en Node.js y básicamente en todas partes. El hecho de que nadie haya notado algo como esto durante los últimos seis años es un poco crítico, pero ha sido detectado y reparado y todo mejorará pronto.

En este artículo, lo haré viajar a través de las matemáticas del azar, hasta el pseudo-azar, y luego volveré y abordaré la historia del malvado PRNG y sus sustitutos. Si ha estado esperando una excusa para entrar en PRNG, puede usar esta extraña falla y su solución como excusa.

Pero primero algunas palabras de sabiduría:

Cualquiera que considere los métodos aritméticos para producir números aleatorios está, por supuesto, en un estado de pecado. Porque, como se ha demostrado repetidamente, no existe un número aleatorio; solo existen métodos para producir números aleatorios y, por supuesto, un procedimiento aritmético estricto no es un método de este tipo.
John von Neumann

John von Neumann era un hombre muy inteligente, por supuesto. Pero en dos oraciones, transmite algo extremadamente profundo y extremadamente importante sobre las variables aleatorias y su definición matemática. De hecho, cuando realmente comprenda estas dos oraciones, comprenderá más acerca del azar que muchas personas que conocerá.

Variables aleatorias

Lo primero que se aprende en un curso avanzado de probabilidad es la forma extraña, pero profundamente importante, en la que los matemáticos piensan en el azar. Y cuando entiendas el concepto, gritarás un poco cada vez que escuches a alguien decir la frase “número aleatorio”. Tampoco es pedante. Es fundamental.

Los números no son aleatorios. Período. Todos sabemos qué son los números. Los usamos para contar cosas, y los hemos extendido a la incontables e incluso a la irracionalidad, pero lo único que no es ese número es el azar. Siete es siete, y es el mismo siete que fue para Aristóteles y lo será por el resto del tiempo. Es esta no aleatoriedad lo que hace que los números sean útiles para calcular cosas.

Para introducir un concepto de azar en las matemáticas es necesario función. Y las funciones escupen números, pero los números en sí mismos no son aleatorios, son “resultados” de un proceso aleatorio. La posibilidad entra en la función en el lado de entrada. Un matemático dice que una “variable aleatoria” es una función cuyo valor depende de algún estado del mundo a medida que evoluciona con el tiempo. Si dicho estado del mundo a la vez t es St, luego una variable aleatoria xt=f(St).

Si el estado del mundo evoluciona de manera impredecible a partir de ahora (tiempo t) hasta mañana (hora t+1), entonces el valor de x mañana será impredecible. Si puede decir algo sobre las probabilidades en las que estará el mundo, entonces también puede asignar probabilidades a valores futuros de x.

Si lanzo un dado, por ejemplo, puedo estar bastante seguro de las probabilidades respectivas de los estados en cuestión en el mundo, de qué lado está hacia arriba, pero no puedo decir si lanzaré tres o cuatro mañana hasta que llegue mañana. . Y luego, cuando sale, el resultado es un número simple, y cuatro es cuatro para siempre.

Y aquí viene von Neumann. “… no hay un número aleatorio – solo hay métodos para producir números aleatorios …” Y si el método es conocido, si los medios para obtenerlo St Alabama St+1 es matemático y, por lo tanto, perfectamente predecible al mismo tiempo t, no hay forma de que el resultado de mañana sea impredecible. QED, golpe.

PRNGs?

Si puedes señalar cómo St evoluciona con el tiempo, entonces su función no es aleatoria, por lo que todos los PRNG implementados por computadora tampoco son aleatorios. (Ese es el “pseudo-“.) Entonces, ¿qué son? Qué debería sí, si no pueden producir el azar? Aquí hay una lista de tres criterios donde cada uno se basa en los anteriores.

Lo mínimo que le gustaría hacer con PRNG es generar el conjunto completo de valores posibles. Si tiene un PRNG de 8 bits, desea que pueda tomar todos los valores de 0 a 255. En base a eso, desea que todos los resultados posibles aparezcan con la misma frecuencia (para un PRNG uniforme). Y finalmente, quieres el resultado del próximo sorteo (xt+1) ser impredecible ya que ha visto un sorteo anterior completo.

Se dice que un PRNG, que cubre todos los valores posibles, tiene un “período completo” y uno en el que todos los resultados ocurren con la misma frecuencia está “igualmente distribuido”. Estos criterios son lo suficientemente simples como para trabajar en matemáticas o exámenes; simplemente tome muchos valores y vea si hay demasiados de uno o ninguno de los otros. Si PRNG no cubre todos los valores, realmente no se puede distribuir de manera uniforme. Si no se distribuye de manera uniforme, es posible que tenga una capacidad de predicción limitada; si cinco aparecen con demasiada frecuencia, prediga cinco.

La previsibilidad, sin embargo, puede ser aún más sutil y hay muchas pruebas estadísticas interesantes. O, por supuesto, “previsibilidad” es un nombre algo incorrecto. Ni a medida que se actualiza el estado, la palabra “previsibilidad” solo tiene sentido si pretendemos que no lo sabemos St+1, y solo se centra en la historia de la x valores. Finalmente estamos en el “estado de pecado” de von Neumann.

Y JavaScript

Lo que nos lleva a V8 Javascript Math.random(). Durante los últimos seis años, el algoritmo utilizado ha sido bastante terrible. Así que piense en nuestros tres criterios presentados anteriormente y eche un vistazo a la siguiente gráfica de su resultado. (O mire el banner de nuevo). ¿Qué criterios deseados fallan?

Si dijiste “período completo”, tenías razón. Hay huecos donde los números aleatorios simplemente no aparecen, aunque una prueba final requiere más que un diagrama. Y si dijiste “distribución equi” también tenías razón. Mira esas bandas oscuras. Estos son números que aparecen con más frecuencia de lo que deberían.

Por último, si dijo “imprevisibilidad”, en su mayoría tenía razón. La “buena” noticia es que las bandas son esencialmente rayas horizontales, lo que significa que, aunque algunos valores del eje X están sobrerrepresentados, no parecen depender del eje del eje. Pero debido a que los valores del eje y están incondicionalmente mal distribuidos, puede predecir en las regiones con las bandas oscuras y su predicción será mejor que aleatoria.

Entonces, de los tres criterios posibles para juzgar un PRNG, este puntúa cero, basándose simplemente en mirar una gráfica de ciertos valores. El código que generó las imágenes está aquí. (Pruebe PRNG desde su navegador).

Para cuantificar las observaciones anteriores, la publicación oficial de Javascript V8 que vinculé anteriormente señala que la cobertura es de solo 232 valores de los posibles 252 valores distribuidos uniformemente que puede representar un flotante de 64 bits. Este es un gran fracaso del criterio de “período completo”.

Esto es realmente un problema

Además, hay ciclos cortos que dependen de la elección particular del estado inicial. Es decir, para elecciones estatales desafortunadas, el período antes de que se repita el PRNG es aún más corto. Ahora, 232 números posibles parecen muchos, hasta que se da cuenta de que le faltan los valores disponibles en 220 *. Es decir, le falta el 99,999905% del espacio. Y el problema del cumpleaños hace que esta falta sea un gran problema.

Las mejores pruebas de predictibilidad en los PRNG observarán muchas dimensiones más altas y probarán si los resultados dependen entre sí en varios retrasos y con diferentes cantidades de salida anterior utilizadas para predecir el siguiente valor. TestU01 es ahora el más moderno en pruebas de PRNG y es fácil de descargar, por lo que puede probar sus PRNG favoritos si lo desea. Otros favoritos eternos incluyen la prueba Diehard original (¿la tienes?) Y la batería Dieharder mejorada (¡¿Se detendrán los juegos de palabras?!). Pero este PRNG tiene una cara tan fea que no hay necesidad de vencer al caballo muerto.

¿Qué sucedió?

Hay un gran resumen de todas las fallas en el blog. [Mike Malone], el director ejecutivo de Betable. Su empresa utilizó Math.random() en Node.js en sus servidores para asignar tokens por sesión a los usuarios. Pensaron que lo estaban haciendo bien porque las posibilidades de una colisión son muy pequeñas si PRNG hace su trabajo. Calculan que tendrán una posibilidad entre seis mil millones de una colisión en los próximos 300 años. (Están equivocados: no pueden obtener más valores del PRNG que el ciclo de estado completo, que es 264. Pero básicamente tienen razón en que no deberíamos ver una colisión en nuestras vidas).

De hecho, tuvieron una colisión en marzo en un sistema que lanzaron en febrero. ¡Ho! Esta pista [Mike] Haga un análisis muy profundo del PRNG defectuoso, que vale la pena leer. También llama la atención sobre el comentario profético de [Dean McNamee] sobre el cambio de código que introdujo el PRNG faltante:

Yo iría con Mersenne Twister ya que todos los demás lo usan (python, ruby, etc.).

De hecho.

La historia del algoritmo elegido, “MWC1616” es aún más extraña. Parece que [George Marsaglia], el autor de las pruebas Diehard originales anteriores y desarrollador del Mersenne Twister, lanzó una versión de esta rutina el 12 de enero de 1999 y luego una versión mejorada el 20 de enero. Las personas que leyeron el hilo hasta el final obtuvieron el bueno, y eso incluye Numerosas Recetas y muchas otras. De alguna manera, los pobres que llevaron a cabo el PRNG para JavaScript V8 simplemente se equivocaron.

¿Qué sigue?

Pero el error fue encontrado y reparado. Al final, V8 Javascript funciona con un generador XorShift, que parece estar a la vanguardia y pasa todas las pruebas estadísticas en todas las series de pruebas que mencionamos anteriormente. Además, es extremadamente rápido, requiere solo unos pocos mapas de bits y operaciones XOR. Es nuevo, lo que siempre es un problema, pero está funcionando muy bien.

XorShift128 + también se ha fusionado con Mozilla y Safari, así como con Chrome. Pronto obtendrá mejores números aleatorios.

Si quieres jugar con estos PRNG, aquí tienes el código para MWC1616 (¡no!):

uint32_t state0 = 1;
uint32_t state1 = 2;
uint32_t mwc1616() {
  state0 = 18030 * (state0 & 0xffff) + (state0 << 16);
  state1 = 30903 * (state1 & 0xffff) + (state1 << 16);
  return state0 << 16 + (state1 & 0xffff);
}

y esto es lo mismo para XorShift128 + (¡sí!):

uint64_t state0 = 1;
uint64_t state1 = 2;
uint64_t xorshift128plus() {
  uint64_t s1 = state0;
  uint64_t s0 = state1;
  state0 = s0;
  s1 ^= s1 << 23; s1 ^= s1 >> 17;
  s1 ^= s0;
  s1 ^= s0 >> 26;
  state1 = s1;
}

Y si todas estas cosas de pseudo-RNG te hacen anhelar una función de actualización real, honesta a buena, sin darse cuenta del estado, por casualidad tienes algunas buenas opciones: usar desintegración radiactiva o combinar ruido de radio y un túnel cuántico. Por último, si desea asegurarse de que es aleatorio, consulte la baliza de aleatoriedad del Instituto Nacional de Estándares y Tecnología de EE. UU.

  • greymalkin dice:

    Es posible que desee anular el HTML para evitar esos caracteres en el código, de modo que el código se muestre correctamente.

    • Mike Szczys dice:

      Afortunadamente, el complemento de código fuente para WordPress tiene un error molesto que ocasionalmente causa este comportamiento. Debería arreglarse ahora.

  • Larry Williamson dice:

    uint64_t status0 = 1;
    uint64_t estado1 = 2;
    uint64_t xorshift128plus () {
    uint64_t s1 = estado0;
    uint64_t s0 = estado1;
    state0 = s0;
    s1 ^ = s1 17;
    s1 ^ = s0;
    s1 ^ = s0 >> 26;
    estado1 = s1;
    }


    uint32_t state0 = 1;
    uint32_t estado1 = 2;
    uint32_t mwc1616 () {
    estado0 = 18030 * (estado0 y 0xffff) + (estado0 estado1 = 30903 * (estado1 & 0xffff) + (estado1 return state0 }

  • Harry dice:

    “La cobertura es solo 2 ^ 32 valores de los posibles 2 ^ 52 valores distribuidos uniformemente”
    “Ahora 2 ^ 32 posibles los números parecen muchos hasta que te das cuenta de que te faltan 2 ^ 20 “

    2 ^ 52 – 2 ^ 32! = 2 ^ 20

    • Mike Szczys dice:

      Gracias por señalarme esto. Entonces (2 ^ 52) – (2 ^ 32) parece dejar el 99% de los valores disponibles. Actualicé la publicación para reflejar esto. Gracias.

      • Elliot Williams dice:

        ¡Es peor que eso, Mike! Debe leer “por un factor de 2 ^ 20”.

        Restar esos números casi siempre es engañoso, y no era mi intención.

  • Artenz dice:

    Si está haciendo algo relacionado con la seguridad, no confíe ciegamente en el generador aleatorio que viene con su entorno de programación.

    • Dan J. dice:

      Si bien entiendo lo que está diciendo, la gran mayoría de nosotros confiamos en el PRNG, que viene con un lenguaje de programación familiar, mucho más de lo que hacemos algo estúpido como tratar de mejorarlo. Puede explorar y utilizar una función como XorShift128 + mencionada anteriormente. Pero aún confía ciegamente en que el algoritmo es correcto y que fue implementado correctamente por quien escribió la función para cualquier idioma que utilice. Si bien hay muchas personas mordidas que confían en PRNG como la descrita anteriormente con Javascript, apuesto a que hay muchas más personas mordidas tratando de improvisar en un campo en el que no tienen experiencia. A menos que haya pasado años de estudio para convertirse en un experto, debe confiar en alguien.

      • Artenz dice:

        Tampoco recomiendo improvisar, pero existen algoritmos en línea apropiados y ampliamente controlados que vienen con implementaciones de referencia.

        • inconcebible dice:

          ¿OpenSSL no tiene funciones para esto?
          Si ya no confía en ese equipo de desarrollo, siempre hay “/ dev / random”
          (mejor que desperdiciar el grupo de entropía finita “/ dev / urandom” a pesar de los conceptos erróneos comunes)

          • pelotón dice:

            No estoy seguro de cuáles son las partes internas, pero los documentos del nodo dicen que esto es “cripto fuerte”: https://nodejs.org/api/crypto.html#crypto_crypto_randombytes_size_callback

            `require (‘criptografía’). randomBytes (256) .toString (‘hex’) `

          • Forrest Voight dice:

            Creo que intercambiaste accidentalmente / urandom allí.

          • Elliot Williams dice:

            @plate: lea los detalles al final de la página. El libro de cifrado de Node.js implementa muchos algoritmos, algunos buenos y otros malos, presumiblemente con fines históricos. Todavía hay muchas formas de malinterpretar las cosas. 🙂

  • rano99705 dice:

    https://xkcd.com/221/

  • sonofthunderboanerges dice:

    Elliot Williams – “Y si todas estas cosas de pseudo-RNG quisieran que fueras un poco real, honesto a bueno, sin conocimiento de la función de vanguardia, por casualidad tienes algunas buenas opciones: usar desintegración radiactiva o combinar radio ruido y tunelización cuántica. Si desea asegurarse de que es aleatorio, eche un vistazo al Random Signpost del Instituto Nacional de Estándares y Tecnología de EE. UU. “

    ¿Qué opinas de esta lluvia de ideas? http://oi67.tinypic.com/2qkqxjp.jpg

    Por supuesto, la longitud del RNG de salida es igual al tiempo que le toma a la Tierra hacer que su objetivo desaparezca de la vista, es decir, si usted, por supuesto, no lo compensa automáticamente.

    • sonofthunderboanerges dice:

      http://i2.wp.com/astrobob.areavoices.com/files/2011/09/Twinkling-stars.gif?resize=304%2C234

    • Elliot Williams dice:

      Se sugiere utilizar una llamarada estelar, que ocurre porque la luz se refracta debido a cambios desiguales en la atmósfera de la Tierra. No soy astrónomo, pero …

      1) Apuesto a que mi bippie tiene mucha correlación de baja frecuencia, porque el viento mueve el aire tan rápido. No esperaría tantas piezas al azar por segundo.

      2) No es confiable. En las noches todavía despejadas, apenas brillas y cuando está muy nublado, lo eres aún menos.

      Todo el mundo tiene que reinventar al menos una rueda, pero el ruido de una unión de diodos de polarización invertida es bueno a cientos de kiloshertz. Debes tener suficientes necesidades extremas de numeración aleatoria para que eso no sea suficiente, y son cincuenta centavos en partes. Empiece por ahí, luego saque el telescopio.

      • inconcebible dice:

        Estoy seguro de que hay un tutorial de arduino para eso.

        • sonofthunderboanerges dice:

          bazinga! 🙂

      • sonofthunderboanerges dice:

        Elliot Williams – Estoy de acuerdo con usted en el punto de baja frecuencia. Eso sí vino a mi mente. Por eso dije solo Voice Scrambler y no cifrado de datos. Parece que no necesitas mucha aleatoriedad de alta frecuencia para confundir a un oyente informal que intenta alterar tu voz. Por supuesto, un re-secuenciador que mezcle sus oraciones de una manera predecible endurecería eso (es decir, ¿el esquema SIGSALY de la Segunda Guerra Mundial?).

        Re # 2 – sí, eso sería cierto si intentaras hacerlo EN VIVO. Pero si tuviera que grabar algunos de ellos para su uso posterior, así como cómo hicieron los registros fonográficos de las luces de vapor de mercurio para SIGSALY, entonces podría esperar las mejores noches para hacer esto. Solo se usarán como OTP más adelante.

        Sí, vi esa idea de diodo de polarización inversa de un inventor ruso en alguna parte, sí, sería más barato que un telescopio de segunda mano. Supongo que tengo demasiados en mi armario. Probablemente incluso tenga ese diodo,

        • Jeff Marshall dice:

          noche menor re:

          > un secuenciador que mezcle sus oraciones de una manera predecible lo haría difícil (es decir, ¿esquema SIGSALY de la Segunda Guerra Mundial?)

          SIGSALY no mezcló oraciones, fue un cifrado puramente digital del sonido codificado en PCM. Como tal, necesitaba una buena fuente de aleatoriedad (es decir, lo más cerca posible de 1 bit de entropía a 1 bit de almohadilla de una sola vez) o sería sensible a todos los problemas. sensible a.

          • sonofthunderboanerges dice:

            Jeff Marshall – Sí, tienes razón Jeff para SIGSALY No debería decir “oraciones”. Supongo que pensé en algunas muestras. Es posible que haya fusionado esta mezcla de voz israelí de 2010: https://www.youtube.com/watch?v=U24Q6sTnlDo

        • Elliot Williams dice:

          Por cierto: Lo siento si eso resultó ser negativo. Lo que quiero decir con el diodo RNG es que _ realmente tienes que probarlo_. Como ahora. Solo tomará una hora armar uno, y será mejor para usted que leer una hora de sitios web.

          Demasiadas hipótesis y planificación te dejarán ciego. ¡Construye algo! (Y pruébalo.)

          • sonofthunderboanerges dice:

            Elliot Williams – ¡Pero me gusta leer tus cosas! Aprendo mucho de ti Elliot. Pero re: el diodo. Sé que es un generador de OTP increíble, pero no necesito una necesidad comercial para nada críptico. Solo soy un inventor soñador con demasiado tiempo en mis manos para hacer una lluvia de ideas innovadoras. Ya sabes que esta es mi segunda identidad excéntrica (¡pero no lo que hago para ganarme la vida!): Http://cdn.ultraswank.net/uploads/Desmond-Llewelyn-as-the-eccentric-Q- 1000 × 1377 .jpg

    • duh dice:

      Gracias … Ahora conozco un dominio para agregar a mi directorio para indicar 127.0.0.1.

      • sonofthunderboanerges dice:

        ¿Tu propia computadora? ¿No es eso predeterminado o eres sarcástico? ¿A quién respondiste?

    • brucesertrat dice:

      Recuerdo el día en que alguien instaló una cámara de video dirigida a una lámpara de lavado como generador aleatorio … Lavarando, en Silicon Graphics https://en.wikipedia.org/wiki/Lavarand

  • Billy La Gator dice:

    Otro ejemplo de lo que sucede cuando dejas que “java haga las cosas difíciles”. Java es ideal para desarrolladores con pocas habilidades o principiantes que solo quieren crear algo, de alguna manera como una base de video, pero sin la elegante interfaz gráfica de usuario, el depurador, la compatibilidad, la compatibilidad con IEEE-751 y otros “trucos” que solo son “reales”. los desarrolladores usarían.

    • sonofthunderboanerges dice:

      Creo que te refieres a JavaScript pero no a Java. Java no es para principiantes.

      • brucesertrat dice:

        Creo que dejó el [sarcasm] etiquetas, como IEEE-751 son normas que rigen la estructura de las estructuras de transmisión de madera.

        También conocido como ‘barras telefónicas’ 🙂

        • sonofthunderboanerges dice:

          No sé si mucha gente fusiona JAVA con JAVASCRIPT (JS) porque la primera toma prestada la palabra simbólica de café JAVA. JS también es casi omnipresente en el mundo de los navegadores. JAVA también está ahí, pero generalmente se refiere a todo tipo de virus. Algunas personas bloquean el acceso de JAVA y ActiveX a sus navegadores.

          JS también puede hacer algo de daño, pero pocos lo bloquean. Utilizo NoScript para bloquear selectivamente el mío. JS es OO (objeto) y, por lo tanto, lo fusionan con JAVA. JAVA es ahora en gran parte un requisito previo para muchos grandes desarrolladores corporativos. Eso o C ++ o Visual Basic. Estoy de acuerdo en que JS es un lenguaje ligero para aprender contra los demás, pero algunos pueden hacer que los scripts de miedo sean difíciles de revertir. Creo que lo hacen a propósito.

          Siendo un programador imprudente, odio transformar un simple HELLO WORLD en un guión de aspecto confuso, como hacen algunos. ¡Ve a stackoverflow y diviértete con las estúpidas guerras de códigos de estilo entre desarrolladores de todo el mundo!

          Re: IEEE-751 – Ningún cuerpo es perfecto. Billy The Gator obviamente se refería a IEEE-754.

          SQTB

  • Michael Pohoreski dice:

    Esta es una noticia en parte vieja. La gente conoce el desagradable RNG de Javascript desde hace ** años. ** El problema con el Mersenne Twister es que es un perro lento (relativamente hablando). Siempre ha habido un intercambio entre calidad y velocidad.

    * https://nakedsecurity.sophos.com/2013/07/09/anatomy-of-a-pseudorandom-number-generator-visualising-cryptocats-buggy-prng/
    * http://xorshift.di.unimi.it/#quality
    * http://demesos.blogspot.com/2011/09/replacing-java-random-generator.html

    • brucesertrat dice:

      Solo tengo que decir que “Mersenne Twister” suena como una especie de maniobra acrobática cada vez que lo leo …

      “El cobarde estaba sentado en mi cola y estaba a punto de fumarme cuando acerqué un 4G Mersenne Twister a la cubierta y lo rocié …”

  • sonofthunderboanerges dice:

    Elliott Williams – Hablando de “Reinventar la rueda” – simplemente haciendo una lluvia de ideas de nuevo (mi premonición, supongo) – usando JavaScript (que probablemente es un poco imposible), ¿alguien podría modificar el antiguo Screener de Eratóstenes para generar una matriz completa de números no primos ( NPN) ¿suficiente para llenar algunas páginas para futuros trabajos de OTP? Las NPN serían el resultado de dos no primos grandes elegidos aleatoriamente por el hombre (las claves privadas). La salida se puede filtrar para mostrar solo números con longitudes manejables de 3 a 10 dígitos de longitud (esto es experimental). Ninguno de los resultados de la NPN se utilizaría posteriormente matemáticamente ni ponderados y / o vinculados para su uso como cifrados de reemplazo ASCII (es decir, otra lluvia de ideas o “rueda”). Los resultados de NPN solo se utilizarían como números pseudoaleatorios cuasialeatorios.

    Por supuesto que no son PRN o RN en absoluto. Son conjuntos predecibles de números en un formato aparentemente extraño, que APARECEN para los no iniciados como números reales aleatorios. Incluso RAIN MAN (un idiota de Hollywood) fue capaz de averiguar cualquier relación de estos números. Pero si uno tuviera las claves privadas, entonces podría reproducir estos números extraños la mitad de rápido.

    Creo que Tianhe-2 de PRC o nuestro Best Bluffdale necesitarían al menos unos días (u horas) para encontrar alguna correlación de cada número utilizado en un cifrado basado en esto. Pero los cifrados no son la única aplicación aquí, supongo.

    De todos modos, no estoy seguro de que JavaScript o cualquier otra computadora que no sea una supercomputadora pueda generar una lista utilizable de números en un corto período de tiempo. Lo hice una vez con DEC VAX, pero tomó algo de tiempo, creo que FORTRAN funcionaría mejor para números inusualmente grandes y algo con la velocidad de un Falcon Northwest Mach V o cercano que podría hacer el trabajo en unos pocos segundos.

    • Rollyn01 dice:

      Curiosamente, diseñé el tamiz para descomponer los compuestos combinándolo con la división de pistas. Es un poco complicado, pero puede hacer el trabajo. Simplemente no ahorra realmente en números y no tiene la capacidad de manejar números muy grandes (limitado a la representación de números de la máquina). Compruébalo y verás.

      https://la-tecnologia.io/project/8137-prime-factor-reduction-sieve

      • sonofthunderboanerges dice:

        Rollyn01 – Lo comprobaré. Es realmente genial escuchar a alguien que en realidad es un BTDT (lo hizo). También tengo BTDT con todo lo que dijiste. También tuve que luchar por filtrar fracciones para mantener números enteros. Eso solo agrega tiempo. Javascript en el sistema X86 tarda demasiado en generar suficientes números utilizables. Durante los días de RISC, creo que podría obtener un retorno más rápido. Nunca he usado FORTRAN, probablemente debería hacerlo. En el sistema DEC VAX utilicé un BASIC extendido. VBasic probablemente sería mejor hoy. Sé VB y VBScript (así como JavaScript). Hay una forma de manejar grandes números en BASIC y VB. Lo olvido, pero desactiva la notación científica, que es un PITA real cuando intentas crear un sistema de cifrado extraño.

        Creo que sé lo que dices sobre “guardar” resultados en JavaScript. Usando el bucle for () puede acelerar las cosas, pero la vinculación a una variable local funciona bien. Enviar números a un campo o espacio de texto del cuerpo tiende a ralentizar las cosas. Por lo tanto, es mejor enviarlo allí una vez finalizado el ciclo, pero para automatizar el guardado de los resultados, puede jugar con formas y cadenas de consulta. Con ASP (páginas Active Server) puede generar texto y guardarlo automáticamente en un archivo de texto en la misma carpeta si los privilegios de escritura están configurados correctamente. Todo esto se hace solo con su navegador (idealmente MSIE porque es más indulgente con la codificación imprudente que otros).

        A largo plazo, contrariamente a lo que Elliot sugiere que hago con el método de diodo, no tengo ningún requisito de cifrado / cifrado. No tengo nada que esconder. Solo soy un aficionado, una lluvia de ideas, un inventor, Q. Me encanta Q. Me encantaría ser uno.

        FYI – Para todos los retenedores anales: si me perdí un discurso o no usé el lenguaje vulgar técnico correcto, no me saquen. Soy un codificador imprudente, ¿vale? 🙂

      • sonofthunderboanerges dice:

        Rollyn01 – Leí tu HaD.io y me gustó. Creo que tiene razón en que la parte principal de su problema rápido es el hardware. Usar C ++ es bastante rápido. El más rápido probablemente usaría Assembler, pero dudo que puedas lidiar con números extremadamente grandes allí. Linux también es rápido. Es posible que desee considerar evolucionar a BeagleBone Black. Creo que es caro, pero se dice que la velocidad es fenomenal.

        A… …! Podrías seguir un rastro de la USAF. Puedes ir a todas las tiendas de segunda mano en tu área (más que solo a tu estado de EE. UU.) E intentar recolectar más de 1 760 PlayStation 3S. Aquí está el artículo de PopSci al respecto: http://www.popsci.com/technology/article/2010-12/air-forces-new-supercomputer-made-1760-playstation-3s

        Si bien el “Condor Cluster” de la USAF es asombroso porque puede realizar 500 billones de operaciones de deslizamiento por segundo, su aplicación probablemente no necesite tanta velocidad. Si puede realizar el funcionamiento inverso del funcionamiento del Condor Cluster, es posible que pueda acelerar su tamiz con solo UNA PS3 (o PS4) en su dormitorio. Escuché que la PlayStation de Sony es una especie de superordenador de escritorio.

        Imagínese cuántos GRANDES compuestos podría generar en unas pocas horas o días. Podrías llevar eso a una unidad flash grande y podrías tener una variedad de números asombrosos que parecen desnudos como PRNG, pero en realidad no lo hacen. Todos son números predecibles que requieren que el Condor Cluster o Tianhe-2 se rompa. El hombre no podía hacerlo con papel y lápiz. Tampoco podrían hacerlo con una supercomputadora promedio, en un período de tiempo razonable. Creo que el uso de un número no principal elegido al azar con una mantis igualmente no principal podría generar una OTP muy impresionante para el cifrado.

        Intentar realizar un cifrado inverso basado en este método OTP es abrumador. No habría una correlación FÁCILMENTE detectable entre el texto cifrado de clave pública y cualquier número aparente descubierto. Literalmente tendrían que usar una gran cantidad de supuestas claves privadas para descifrar el cifrado. Eso podría llevar días, si no semanas (o más). Por supuesto, todas las apuestas se disparan si algún espía inteligente encuentra las claves privadas capturando su entrega secreta a su socio de cifrado humano.

        Solo somos aficionados al HaD y nos estamos divirtiendo con eso. Por favor, no lea nada más en él. 8- {)

        SQTP

        • Rollyn01 dice:

          En mi opinión, básicamente lo calificaría como el más cercano a un algoritmo de tiempo polinomial de factorización principal. Debido a que se divide solo cuando es necesario y no requiere la capacidad de generar primos de antemano, es rápido y liviano. Exploraré el BeagleBoard cuando tenga la oportunidad y veré cómo funciona. Tal vez entonces finalmente pueda completar el proyecto (y / o tal vez agregarle capacidades de descifrado, pero una cosa a la vez) y terminarlo.

          • sonofthunderboanerges dice:

            Rollyn01 ÷ También tenía prisa, no comencé los dividendos bajos con longitudes de menos de 3-4 dígitos. Y salir del circuito porque los números comienzan a ser demasiado grandes. La notación científica entra en acción y casi se vuelve inútil para lo que estamos tratando de hacer. FORTRAN podría deshacerse de eso. Me pregunto qué pasaría matemáticamente si vincularas el resultado sin espacios ni ceros. Luego, analice el gran número para configurar agrupaciones de 5 dígitos y utilícelas como su OTP. ¿Seguiría siendo evidente la entropía pseudoaleatoria?

            También encontré, agregando 5 al final de cada divisor, que eliminas muchos números muertos (inutilizables). Porque esto hace que el número sea divisible por 5 o múltiplos de 5 (ad infinitum). No estoy seguro de eso, porque dejé de engañarlo antes de que se pusiera furioso. Me pregunto en qué momento comenzó a dolerle el cerebro a Eratóstenes de Cirene. 🙂

            ¿Estamos intentando hacer algo parecido a lo que hizo Pierre de Fermat en el siglo XVII sin un ordenador? Creo que un banco ya está usando algo similar basado en su último teorema.

            Adafruit vende BeagleBone Blacks por alrededor de $ 45 pero se detiene. NetGate los tiene por $ 55 USD. ¡Brian Benchoff tiene un método para acelerar MUCHO! https://la-tecnologia.com/2013/12/07/speeding-up-beaglebone-black-gpio-a-thousand-times/

        • Rollyn01 dice:

          Demonios, me refería a BeagleBone. Demasiado temprano y no hay suficiente café. jajaja

  • la dice:

    Oh no, no me digas que / r / la programación se filtra y se propaga y que también es una infección de JavaScript desagradable.

  • Mark Sbly dice:

    Umm, ¿qué devuelve realmente xorshift128plus ()?

    • John dice:

      2

    • Tjienta Vara dice:

      Siempre devolverá 0 cuando el estado sea 0.
      Y nunca devolverá 0 cuando el estado sea nulo.

  • L. Escéptico dice:

    “Es nuevo” … ¿para quién? Usé LSFR en un proyecto de dongle de seguridad en 1993. Encontré esta referencia de 1994: http://cypherpunks.venona.com/date/1994/07/msg00088.html.

  • Ryan H. dice:

    ¿Alguien sabe cuánto tiene esto un efecto como LastPass, que usa Math.random para generar IVs y partes de su generador de contraseñas?

    • Elliot Williams dice:

      En la escala de LastPass, ya tendrían colisiones significativas.

      ¿Estás seguro de que están usando Math.random en lugar de un mejor aleatorio críptico?

      Por cierto, no tengo ni idea. Sin embargo, LastPass parece muy bien hecho, y esto no sería un error. Math.random () pretende ser lo suficientemente rápido y no críptico, pero aún cubre una gran cantidad de espacio; ni siquiera hizo esto, ese es el punto de la actualización.

  • Craig Macomber dice:

    La afirmación “no pueden obtener más valores del PRNG que el ciclo de estado completo, que es 2 ^ 64 …” es incorrecta. No hay razón para suponer que el estado interno tiene una duración de ciclo de 2 ^ 64. Un buen PRNG tendría una duración de ciclo mucho más larga: Mersenne_Twister de 32 bits tiene un período de 2 ^ 19937 – 1, por ejemplo: sus matemáticas funcionarían bueno, si se usara tal generador.

    • Elliot Williams dice:

      El Mersenne Twister y todos los PRNG nunca tienen un ciclo más largo que su estado interno. Regrese a la explicación matemática anterior: si hay 2 ^ 64 S_t diferentes, el número máximo de resultados diferentes de la variable “aleatoria” es 2 ^ 64. No puede ser de otra manera.

      No asumí un estado de 64 bits: el 2 ^ 64 del artículo se basó en el estado interno de 64 bits del PRNG elegido: 2 x entidades de 32 bits. Su MT cotizado necesita ~ 20k bits de estado interno.

      Consulte https://en.wikipedia.org/wiki/Mersenne_Twister#Initialization, que explica cómo el algoritmo crea estos 20k bits a partir de una semilla inicial más corta. (Y tenga en cuenta, para fines criptográficos, que esto reduce significativamente el número de posibles secuencias en la práctica).

      Su punto más importante, que si usaran un PRNG mejor como MT, no estarían en este lío, es visible.

  • Jonathan dice:

    Escribí prng superrápido para Linux xor’ing 2 prngs de 64 bits diferentes y sembrándolos por separado. https://github.com/josenk/srandom

    Escribí algo similar (combinado hw, prng) también en Teensey Arduino … También en github si alguien está interesado.

    Un gran reemplazo para todos los que necesite …

    • Artenz dice:

      ¿Qué pasa si sus necesidades aleatorias requieren seguridad de cifrado?

  • Rafael dice:

    Ver http://www.firstpr.com.au/dsp/rand31/p1192-park.pdf publicado por primera vez en 1988.

    • Elliot Williams dice:

      Puede que no haya un recurso, pero ese documento está un poco pasado de moda y las rutinas descritas son todas de módulos múltiples. El documento solo compara diferentes valores “especiales” para las constantes.

      Los buenos que enumeran son grandes generadores de números aleatorios cuando sus requisitos son un mínimo de seguimiento de memoria y sucios. Nadie vale nada por las criptomonedas, y ni siquiera las usaría para un estudio de simulación, simplemente tenemos muchas alternativas mejores hoy en día.

  • voxnulla dice:

    Google raw … mantente alejado de él.

    • sonofthunderboanerges dice:

      ¿Qué recomiendas mejor que GOOGLE?

  • Francis Kim dice:

    parece “igualmente aleatorio” … pero ¿qué significa eso?

  • Que no dice:

    Los juegos suelen utilizar una aleatoriedad desagradable. Lo tienes por ejemplo, elige un nivel aleatorio y es 6 veces seguidas igual y luego otro y luego nuevamente al primero.
    Lo he visto en muchos juegos y ninguna actualización lo corrige. Pero, por supuesto, no solo juegos, siempre que esperes una aleatoriedad de programas, es mejor que no esperes.

    Y como no estoy hablando de juegos javascript, lo mío es que va más allá de un lenguaje y un ejemplo específicos.

  • ESTOLA dice:

    Wow, ni siquiera una mención del registro de cambio de retroalimentación lineal (LFSR). Supongo que no tantos en VHDL / Verilog, pero creo que vale la pena mencionarlo de todos modos desde una perspectiva matemática.

    • alisdexion dice:

      https://la-tecnologia.com/2015/12/28/v8-javascript-fixes-horrible-random-number-generator/#comment-2857849

Matías Jiménez
Matías Jiménez

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *