es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Python ctypes time(0) y C time(0)

Así que estaba haciendo el desafío binario seed-sPRiNG de picoCTF 2019, donde obtuve este informe con este código:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main () 
{ 
    int i;

    srand(time(0)); 

    for (i = 0; i < 30; i++)
    {
        printf("%d\n", rand() & 0xf); 
    }

    return 0; 
} 

Entonces pensé en implementarlo de la misma manera en Python. Al principio, usé el módulo random pero me di cuenta de que la implementación de la función rand en C y en Python son completamente diferentes, así que decidí usar ctypes:

#!/usr/bin/python3

from ctypes import CDLL

libc = CDLL("libc.so.6")

libc.srand(libc.time(0))

for i in range(30):
    print(libc.rand() % 0xf)

Pero sigo obteniendo una salida diferente cuando los ejecuto ambos. ¿Puede explicarme por qué sucede esto?</stdlib.h></time.h></stdio.h>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual el código en C y el código en Python producen resultados diferentes incluso cuando se utiliza la misma semilla es porque utilizan diferentes implementaciones de la función rand(). La función rand() en C genera números pseudoaleatorios utilizando un algoritmo llamado Generador Lineal Congruente (LCG), mientras que la función rand() en Python utiliza el algoritmo Mersenne Twister.

    El algoritmo LCG utilizado por la función rand() en C tiene un módulo y un multiplicador fijos, y su aleatoriedad depende de la elección de la semilla. Sin embargo, el algoritmo Mersenne Twister utilizado por la función rand() en Python tiene un algoritmo diferente que genera números pseudoaleatorios y no se basa en LCG.

    Por lo tanto, dado que las dos funciones se implementan por separado con algoritmos diferentes, sus resultados no necesariamente serían los mismos incluso cuando se utiliza la misma semilla.

Comments are closed.