Número aleatorio en ansi C

Moderador: Fundadores

Avatar de Usuario
casiogames España - Galicia
Seguidor infernal
Seguidor infernal
Mensajes: 24
Registrado: 31 May 2023, 14:20
Has thanked: 1 time
Been thanked: 5 times

Número aleatorio en ansi C

Mensaje por casiogames »

Hola amigos a ver si me podéis hechar un cable , necesito crear un número aleatorio en ansi c para la Casio Z1gr . El problema es que parece que no tiene la función rand() y de C no sé si hay alguna otra instrucción o método . Lo que sí tiene es la función ran# que genera número aleatorio en basic pero claro yo lo necesito en C que estoy pasando allí el proyecto he estado buscando en manuales de la Casio pb-2000c y vx4 pero no encuentro nada o igual no veo cómo generarlo o si se pudiera generar el número en basic con ran# y pasarlo a C igual digo uno burrada pero es que ya no se que hacer.

Gracias por la ayuda.
Avatar de Usuario
cacharreo !Sinclair 1
Moderador
Moderador
Mensajes: 5869
Registrado: 09 Ago 2019, 10:17
Ubicación: /home/cacharreo/
Has thanked: 1209 times
Been thanked: 2829 times
Contactar:

Re: Número aleatorio en ansi C

Mensaje por cacharreo »

También puedes escribir tu propia función de generación de números pseudo-aleatorios en C. Hay muchísimas opciones para ello, por ejemplo, utilizar un registro de desplazamiento con retroalimentación lineal (LFSR).

Código: Seleccionar todo

unsigned short lfsr = 44257;
unsigned bit;

unsigned rand()
{
  bit  = ((lfsr >> 0) ^ (lfsr >> 2) ^ (lfsr >> 3) ^ (lfsr >> 5) ) & 1;
  return lfsr =  (lfsr >> 1) | (bit << 15);
}
test (C89 / X3.159-1989 / ISO/IEC 9899:1990)

Código: Seleccionar todo

#include <stdio.h>

unsigned short lfsr = 44257;
unsigned bit;

unsigned rand()
{
  bit  = ((lfsr >> 0) ^ (lfsr >> 2) ^ (lfsr >> 3) ^ (lfsr >> 5) ) & 1;
  return lfsr =  (lfsr >> 1) | (bit << 15);
}

int main()
{
  unsigned short b;
  
  for ( b = 0; b < 20; b++ )
    printf( "%u\n", rand() );
    
  return 0;
}
El valor inicial de la variable global lfsr se utiliza como semilla para la generación de pseudo-aleatorios. Si se escoge una basada en un valor cambiante como, por ejemplo, un reloj (milisegundos desde el arranque), la lectura de un puerto analógico,... la secuencia será diferente a cada ejecución del programa.
© cacharreo
Avatar de Usuario
casiogames España - Galicia
Seguidor infernal
Seguidor infernal
Mensajes: 24
Registrado: 31 May 2023, 14:20
Has thanked: 1 time
Been thanked: 5 times

Re: Número aleatorio en ansi C

Mensaje por casiogames »

hola y gracias por la ayuda.
Pero me da error al asignar el valor 0xACE1u a la variable.

Te adjunto un emulador de la casio fx-870p que tiene un C compatible con la mia para ingresar en C presionas la tecla roja que tiene una S y luego la tecla amarilla FX, asi entras en C luego eliges la ranura que seria del 0 al 9 y presionas S para empezar a meter el codigo.
Al finalizar el codigo haces lo mismo S y FX pero ahora le das a la L para compilarlo y luego escribes RUN para ejecutarlo.
Si encuentras algo para generar numeros aleatorios te lo agradezco.

aqui la url : https://we.tl/t-2US6z6giof
Avatar de Usuario
cacharreo !Sinclair 1
Moderador
Moderador
Mensajes: 5869
Registrado: 09 Ago 2019, 10:17
Ubicación: /home/cacharreo/
Has thanked: 1209 times
Been thanked: 2829 times
Contactar:

Re: Número aleatorio en ansi C

Mensaje por cacharreo »

De nada, siento que no haya compilado.

Agradezco el emulador pero mi equipo tiene Linux ahora mismo no tengo acceso a máquinas Windows.

El código anterior es sólo una idea, hay muchos métodos de generar números pseudo-aleatorios. Antes había verificado que el código cumplía con el std89 pero, aún así y en cuanto la asignación, podemos intentar trasladarla a "main" y ver qué tal.

test

Código: Seleccionar todo

#include <stdio.h>

unsigned short lfsr;
unsigned bit;

unsigned rand()
{
  bit  = ((lfsr >> 0) ^ (lfsr >> 2) ^ (lfsr >> 3) ^ (lfsr >> 5) ) & 1;
  return lfsr =  (lfsr >> 1) | (bit << 15);
}

int main()
{
  unsigned short b;
  
  lfsr = 44257;
  
  for ( b = 0; b < 20; b++ )
    printf( "%u\n", rand() );
    
  return 0;
}
© cacharreo
Avatar de Usuario
casiogames España - Galicia
Seguidor infernal
Seguidor infernal
Mensajes: 24
Registrado: 31 May 2023, 14:20
Has thanked: 1 time
Been thanked: 5 times

Re: Número aleatorio en ansi C

Mensaje por casiogames »

Buenas.
Me sigue fallando en al ingresar ese valor en la variable.
En el manual de la casio pb2000c hay un escrito en c en la pagina 85 que parece que genera numeros aleatorios lo probe pero siempre genera los mismos numeros.
este es el libro
http://www.pisi.com.pl/piotr433/manuals/c_lang.pdf

pagina 85.
pero siempre genera los mismos numeros.
lo que hice fue quitar el apartado line y puse un print para ver los numeros.
Avatar de Usuario
cacharreo !Sinclair 1
Moderador
Moderador
Mensajes: 5869
Registrado: 09 Ago 2019, 10:17
Ubicación: /home/cacharreo/
Has thanked: 1209 times
Been thanked: 2829 times
Contactar:

Re: Número aleatorio en ansi C

Mensaje por cacharreo »

casiogames escribió: 02 Jul 2023, 00:12Me sigue fallando en al ingresar ese valor en la variable.
Debe ser un problema tonto con el formato de la asignación. Éste es el mismo valor pero más obvio,

Código: Seleccionar todo

lfsr = 44257;
casiogames escribió: 02 Jul 2023, 00:12parece que genera numeros aleatorios lo probe pero siempre genera los mismos numeros.
Eso va a pasar con todos los programas similares, el que hay más arriba incluido. La clave es inicializar los valor de lfsr, _seed1, _seed2, _seed3 con valores que no sean siempre los mismos.

Con este objetivo se puede leer el reloj de la calculadora, si es que tiene; esperar una tecla y contar hasta que el usuario la pulsa,... Otra estrategia sería guardar en memoria los últimos valores de las variables con las semillas (lfsr, _seed1, _seed2, _seed3,...) y cargarlas al principio del programa. Este de las semillas es otro asunto muy diferente.
© cacharreo
Avatar de Usuario
casiogames España - Galicia
Seguidor infernal
Seguidor infernal
Mensajes: 24
Registrado: 31 May 2023, 14:20
Has thanked: 1 time
Been thanked: 5 times

Re: Número aleatorio en ansi C

Mensaje por casiogames »

ahora si me funciona , gracias por tu ayuda.
Avatar de Usuario
explorer
Aspirante a demonio
Aspirante a demonio
Mensajes: 206
Registrado: 22 Oct 2017, 03:27
Ubicación: Valladolid, España
Has thanked: 8 times
Been thanked: 32 times
Contactar:

Re: Número aleatorio en ansi C

Mensaje por explorer »

ANSI C cuenta con funciones específicas para la generación de números aleatorios, en la biblioteca estándar (stdlib.h).

Ejemplo:

Código: Seleccionar todo

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

srand(time(NULL));   // Inicialización, debería llamarse una vez, al principio del programa.
int r = rand();      // Devuelve un entero pseudo-aleatorio entre 0 y RAND_MAX.
Tienes documentación en tu propio ordenador. Ejecuta el comando

Código: Seleccionar todo

apropos rand
y saldrá un listado de las páginas de manual relacionadas con el tema.

Ejemplo:

Código: Seleccionar todo

drand48 (3)          - generan números seudo-aleatorios distribuidos uniformemente
erand48 (3)          - generan números seudo-aleatorios distribuidos uniformemente
jrand48 (3)          - generan números seudo-aleatorios distribuidos uniformemente
lrand48 (3)          - generan números seudo-aleatorios distribuidos uniformemente
mrand48 (3)          - generan números seudo-aleatorios distribuidos uniformemente
nrand48 (3)          - generan números seudo-aleatorios distribuidos uniformemente
rand (3)             - generador de números pseudo-aleatorios
random (3)           - generador de números aleatorios.
random (4)           - dispositivos de la fuente de números aleatorios del núcleo
srand (3)            - generador de números pseudo-aleatorios
srand48 (3)          - generan números seudo-aleatorios distribuidos uniformemente
srandom (3)          - generador de números aleatorios.
urandom (4)          - dispositivos de la fuente de números aleatorios del núcleo
openssl-rand (1ssl)  - generate pseudo-random bytes
rand (1ssl)          - generate pseudo-random bytes
random (7)           - overview of interfaces for obtaining randomness
shuf (1)             - generate random permutations
systemd-random-seed (8) - Load and save the system random seed at boot and shutdown
systemd-random-seed.service (8) - Load and save the system random seed at boot and shutdown
Ejemplo de una página de manual:

Código: Seleccionar todo

man 3 drand48
Avatar de Usuario
cacharreo !Sinclair 1
Moderador
Moderador
Mensajes: 5869
Registrado: 09 Ago 2019, 10:17
Ubicación: /home/cacharreo/
Has thanked: 1209 times
Been thanked: 2829 times
Contactar:

Re: Número aleatorio en ansi C

Mensaje por cacharreo »

casiogames escribió: 02 Jul 2023, 21:11ahora si me funciona , gracias por tu ayuda.
De nada, me alegro que funcione. Con tu permiso edito las versiones anteriores del código por si en el futuro llega alguien y, sin leer todo el tema, intenta utilizarlo.

Me gustaría también saber cómo te fue con las sugerencias para los variables con los valores de las semillas del generador de pseudo-aleatorios y cómo finalmente lo resolviste.
explorer escribió: 03 Jul 2023, 00:09ANSI C cuenta con funciones específicas para la generación de números aleatorios, en la biblioteca estándar (stdlib.h).
Por si se te ha pasado, que no pasaría nada, ¿tienes en cuenta que hablamos de la calculadora Casio Z-1GR? Todas las funciones que ofrece están preprogramadas (en ROM) y rand() no es una de ellas. De hecho el manual de introducción al C dedica casi un capítulo para escribir una función de generación de pseudo-aleatorios, lo que no sería lógico si pudiera simplemente referenciarla pero, además, al final del manual aparece una página para cada función disponible con su explicación y ejemplos, y tampoco aparece rand().

En esta calculadora la directiva del preprocesador "#include" es también peculiar pues no soporta ficheros de cabeceras (o de inclusión declarativos del tipo .h) y sirve exclusivamente para incluir código. Por ejemplo, nuestro compañero @casiogames podría escribir la función rand() guardarla en la calculadora como "rand.c" y después añadir en otros programas #include "rand.c" para poder utilizarla, pero no da para mucho más. ;)

A propósito, @casiogames, ¿cuál es la tecla MENU en el emulador? En el manual la mencionan una y otra vez pero no la he encontrado.
© cacharreo
Avatar de Usuario
casiogames España - Galicia
Seguidor infernal
Seguidor infernal
Mensajes: 24
Registrado: 31 May 2023, 14:20
Has thanked: 1 time
Been thanked: 5 times

Re: Número aleatorio en ansi C

Mensaje por casiogames »

La tecla menú está presente en la Fx-890, z-1,Z1gr , pero no en el emulador que te di . En ese emulador tienes que usar la combinación de teclas para entrar en C. Luego hay un emulador específico para cada modelo que sirve para qindows Linux y móviles creo que se llama pockemul lo puedes instalar tiene muchos emuladores luego creo que por 2 euros te dejan elegir 1 mes cualquier emulador.
Responder

Volver a “Otros Sistemas”