¿Generando una lista de números aleatorios sin duplicación usando C?

3 minutos de lectura

Estaba haciendo un juego de rompecabezas y quiero generar una lista de números aleatorios entre un límite. Ya he usado la función rand y srand pero también me da un valor duplicado. Quiero generar una lista aleatoria sin duplicación, ¿cómo lo haría?

  • ¿Estás diciendo que está generando los mismos números en cada llamada? ¿O simplemente que de vez en cuando repite números? Si es lo último, no conozco una mejor manera que hacer un seguimiento de los números que ya ha generado y mantener esa información a medida que genera valores únicos.

    – preliquia

    19 de enero de 2012 a las 17:23

  • stackoverflow.com/a/196065/857994 en realidad es mejor 🙂

    – John Humphreys

    19 de enero de 2012 a las 17:24

  • @w00te: Esta no es exactamente la misma pregunta, ya que aquí no se especifica un límite superior pequeño para los números aleatorios.

    – salva

    19 de enero de 2012 a las 18:53


  • Sí, me di cuenta de eso, pero pensé que era útil. Tenga en cuenta que no emití un voto cerrado 🙂

    – John Humphreys

    19 de enero de 2012 a las 18:58

avatar de usuario
david gelhar

El enfoque habitual para esto es algo como:

  populate an array source_array of size <n> with numbers from 0 to n-1

  while n > 0
  use rand to generate a random number x in the range 0..n-1

  add source_array[x] to the result list

  source_array[x] = source_array[n-1]; // replace number just used with last value

  --n; // next time, one less number

  • y consulte stackoverflow.com/questions/196017/unique-random-numbers-in-o1/… para obtener una explicación más detallada, con imágenes

    – David Gelhar

    19 de enero de 2012 a las 17:29

avatar de usuario
TI

Supongo que está usando una matriz para almacenar los números, podría usar algo como este inArray() función y utilícela con un do ... while bucle que generaría un número aleatorio hasta que genera uno que no está en la matriz

Editar: El comentario de w00te enlaza con esta respuesta, que creo que es mejor que mi método y definitivamente vale la pena leerla. Esto es también lo que sugiere brevemente David Gelhar.

avatar de usuario
salvar

Este método resulta apropiado cuando el límite es alto y solo desea generar algunos números aleatorios.

#!/usr/bin/perl ($arriba, $n) = @ARGV;  # generar $n números enteros en [0, $top)

$last = -1;
for $i (0 .. $n-1) {
    $range = $top - $n + $i - $last;
    $r = 1 - rand(1.0)**(1 / ($n - $i));
    $last += int($r * $range + 1);
    print "$last ($r)\n";
}

Note that the numbers are generated in ascending order, but you can shuffle then afterwards.

To avoid duplication, you could store all generated numbers in a list and on each iteration, check if the number was already generated; If yes, regenerate, if not add it to the list and show it.

You can do this:

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

#define MAX_NUMBER_VALUE 60
#define HOW_MANY_NUMBERS 10

int main ( void )
{
    int numbers[HOW_MANY_NUMBERS];  contador int = 0;  while ( contador < CANTIDADES_NUMEROS_) { int tempRandom = rand (VALOR_NUMERO_MAX + 1);  control int = 0;  while (cheque <= contador) { if (número[counter] == número[check] ) tempRandom = rand (MAX_NUMBER_VALUE + 1);  } printf("Número aleatorio #%d - Valor: %d", contador, tempRandom);  } }

Necesitas realizar esto, pero funciona.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad