Autor Tema: Fórmula creación de números pseudoaleatorios

0 Usuarios y 1 Visitante están viendo este tema.

31 Diciembre, 2021, 09:25 am
Leído 269 veces

demo

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 14
  • País: ar
  • Karma: +0/-0
Hola. Quiero crear una función seudoaletoria en lenguaje C sin rand pero no me sale. Siempre obtengo el mismo número incluso metiendo las cuentas dentro de un bucle. Necesito una mano. También quisiera que m valga=999999999 y que se generen números sólo del 1 al 37.

Hasta ahora tengo esto:

semilla=(4);
aditivo=(7);
multiplicador=(5);
m=(8);
c=7;

Dentro del bucle:
resultado1=(multiplicador*semilla)+aditivo;
resultado2=(resultado1/m);
resultado3=resultado1-resultado2;
resultado4=resultado1-resultado3;

Asi obtengo el primer número seudoaleatorio.

Luego dentro del bucle agregue:
semilla=resultado4;

Pero no obtuve buenos resultados


Saludos y gracias

31 Diciembre, 2021, 10:37 am
Respuesta #1

geómetracat

  • Moderador Global
  • Mensajes: 3,140
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
No sé qué estás haciendo dentro del bucle, la verdad. No tienes que dividir por \[ m \], sino tomar el módulo (el resto de la división entera por \[ m \]).

Deberías hacer algo así:

resultado = multiplicador*semilla + aditivo;
resultado = resultado % m;

Ese es tu primer número aleatorio. Si quieres generar más haces semilla=resultado y vuelves a aplicar la fórmula.

Eso te da números entre \[ 0 \] y \[ m-1 \] (ambos incluidos). Si quieres números entre \[ 1 \] y \[ 37 \], con \[ m>37 \], una cosa que puedes hacer es después de calcular el resultado sacar como número pseudoaleatorio este:

numero = (resultado % 37) + 1;

Pero cuidado, en la siguiente iteración debes usar como semilla la variable resultado, y no este número.
La ecuación más bonita de las matemáticas: \( d^2=0 \)

31 Diciembre, 2021, 12:04 pm
Respuesta #2

demo

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 14
  • País: ar
  • Karma: +0/-0
Gracias por tu respuesta. Fuiste muy claro.

Ahora... ¿Que significa resultado % m? ¿Que cuenta hace?

Por otro lado, mi idea es que m sea muy grande. Tan grande como un bucle de 999999999 para que la secuencia no se repita.  Sin embargo si pongo ese número en la fórmula me da números negativos. O probé con m=100 y la secuencia se repite un montón igual que con 37. ¿Hay alguna forma de evitarlo?

Por último, la segunda fórmula no me funcionó. Me da cualquier cosa.

Otra vez gracias por tu respuesta.

31 Diciembre, 2021, 12:15 pm
Respuesta #3

geómetracat

  • Moderador Global
  • Mensajes: 3,140
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
Ahora... ¿Que significa resultado % m? ¿Que cuenta hace?
Es el resto de la división entera de resultado por m. Te da siempre un número entre \[ 0 \] y \[ m-1 \]. Por ejemplo, \[ 20\%5=0 \] porque \[ 20=5\cdot 4 +0 \], \[ 23\%5 = 3 \] porque \[ 23 = 5\cdot 4 + 3 \], etc.

Citar
Por otro lado, mi idea es que m sea muy grande. Tan grande como un bucle de 999999999 para que la secuencia no se repita.  Sin embargo si pongo ese número en la fórmula me da números negativos. O probé con m=100 y la secuencia se repite un montón. ¿Hay alguna forma de evitarlo?
No debería dar números negativos. Si lo hace, probablemente sea por el tipo de número que estás usando. Hace mil años que no programo en C, pero si estás usando el tipo int probablemente no llegue para representar 999999999. Deberías usar enteros de tipo long.
La ecuación más bonita de las matemáticas: \( d^2=0 \)

31 Diciembre, 2021, 03:25 pm
Respuesta #4

Abdulai

  • Moderador Global
  • Mensajes: 2,694
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
Tenés que declarar las variables como unsigned int, unsigned long o unsigned long long,  de lo contrario aunque el resultado final no supere los límites en una suma o sobre todo producto intermedio sí.