(lo que significa hacer)
Mientras trabajaba en un proyecto "Deal or no deal", realicé una función check (); para verificar si hay dos casos iguales, y si lo son, cambie uno de ellos y vuelva a verificarlo.
La función deal establece números aleatorios para los casos con los premios, y luego llama al cheque ();
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void deal(void);
void check(void);
int cases[22];
int prizes[22]=1,2,3,4,5,6,8,10,15,20,25,35,50,65,85,100,105,135,165,200,250};
int main()
{ int a=0;
deal();
while (a<22){
printf("%d n",cases[a] );
a++;
}
return 0;
}
void deal(void){
srand(time(NULL));
int r;
int n = 1;
while (n <= 22){
r = rand() % 21;
cases[n] = prizes[r];
n++;
}//Ends while loop
check();
}//Ends function
void check(void){
int i = rand() % 21;
int m = 0;
int n = 0;
srand(time(NULL));
while(m < 22){//Nested while loop
while ( n < 22){
if (m == n){
n++;
continue;
} else {
if(cases[m] == cases[n]){
cases[m] = prizes[i];
i = rand() % 21;
continue;
}else{
n++;
continue;
}
}
}//End of inside loop
m++;
n = 0;
}//End of nested loop
}//End function
Sin embargo, imprime los números sin marcar, o no se verifica correctamente. Estoy usando IDE de bloques de código
Gracias por adelantado.
Respuestas
1 para la respuesta № 1Ya casi llegas, hay un simple (y bastantecomún) algoritmo o haciendo un scramble en una matriz. Con una pasada a través de la matriz puede aleatorizar las posiciones de cada valor sin duplicarlos. La función de verificación no es necesaria ahora debido a la operación de la función de aleatorización.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void deal(void);
void check(void);
int cases[22];
int prizes[22] = {1,2,3,4,5,6,8,10,15,20,25,35,50,65,85,100,105,135,165,200,250};
int main()
{
srand(time(NULL));
int a = 0;
deal();
for(a = 0 ; a < 22 ; a++)
printf("%d n", cases[a]);
return 0;
}
//this is a neat algorithm for re-ordering an array without duplication
void scramble(int* array, int length)
{
int i;
int r;
int temp;
for(i = 0 ; i < length ; i++)
{
//swap this element with a random one to it"s left (or itself)
r = rand() % (i + 1);
temp = array[r];
array[r] = array[i];
array[i] = temp;
}
}
void deal(void)
{
int r;
int n = 1;
//copy the prizes across directly
for(n = 0 ; n < 22 ; n++)
cases[n] = prizes[n];
scramble(cases, 22);
}
Examine la función scramble () en detalle y la encontrará bastante interesante.
Editado para cambiar el algo a una sola pasada según una sugerencia en los comentarios.