Como crear un vector con 3/4 de probabilidad de exito

Iniciado por alpachino98, 7 Octubre 2017, 13:10 PM

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

alpachino98

El programa debe realizar una búsqueda dentro de varios vectores, de 10,de 100, de 1000...el problema es que el vector antes tenia una probabilidad de exito de 1/2 porque solo creaba vectores con numeros pares. Lo que tengo que hacer ahora es conseguir que la probabilidad sea de 3/4.

Esta era la función crear vector original:
void CrearVector (Vector v, int n)
{
int i;
   
    // Guarda en el vector los números pares incluidos en el intervalo [0,2n[
for ( i = 0; i < n; i++ )
v[i] = i*2;
}


Y esta nuestra modificación:

void CrearVector (Vector v, int n)
{
int i=0;
    cout<<n<<endl;
    // Guarda en el vector los números pares incluidos en el intervalo [0,2n[

while( i<(0.75*n))
{
if (i%2==0)
v[i]=i*2;
else
v[i] = i;
i++;
}
for ( i; i < n; i++ )
v[i]=i*2;

for(i=0;i<n;i++)
cout<<v[i]<<" ";

}


En nuestra modificación salen tanto numeros pares como impares pero hasta 3/4 del tamaño de nuestro vector, el problema es que salen desordenados y tenemos que realizar una busqueda binaria. Si alguien sabe como hacer que salgan ya ordenados o otro metodo para que la probabilidad sea de 3/4. Gracias de antemano :P

ivancea96

Si no entendí mal, quieres que los primeros 3/4 del vector sean los números del 0 al n*(3/4), y el resto, todo pares (?)

En cualquier caso, no entiendo la finalidad del algoritmo de crear el vector.
En el segundo código, en el while, si i es par, lo multiplicas por 2.
Eso quedaría: 1, 4, 3, 8, 5, 12...
¿Por qué así? ¿Por qué multiplicar por 2 los pares?

Serapis

Te leo y releo, pero no acabo de entender qué quieres decir con "probabilidad de 3/4"...
Probabilidad de 3/4 ¿de QUÉ?.
Tampoc me queda claro, cuál es el propósito dle programa... pero mejor te digo lo que me parece entender y tu amplias detalles.

Creas vectores de números pares? (o también impares?). Ordenados?). Si están ordenados y están consecutivos, es superfluo generarlo, siempre podrás calcular al instante el enésimo valor de la secuencia.

Si multiplicas un número (par) por 0'75 (3/4), es equivalente a un bucle donde vas sumando cada vez 1'5:
2: (2 * 0'75) = 1'5
4: (4 * 0'75) = 3
6: (6 * 0'75) = 4'5
8: (8 * 0'75) = 6
Luego preguntarle si el número que sal es par, es perder el tiempo, matemáticamente es demostrable que en esa secuencia el resultado (de multiplicar n * 0'75)  será par, siempre que 'n' sea congruente con 8. ((n modulo 8) = 0 ), en resumen siempre que sea múltiplo de 8. Esto hace innecesario la multiplicación.
(no veo cual es el objetivo de todo esto).

Luego aparece 'otro' 3/4 pero este dices que es el tamaño del array... y luego dices que haces una búsqueda binaria...

En fin, es imposible entender qué es lo pretendes hacer. Explícate ordenadamente y con claridad. Tu tienes claro que necesitas, pero al explicarte te dejas cosas en 'el tintero' como si los demás ya nos hubieran explicado el planteamiento del problema...

alpachino98

El programa busca números aleatorios dentro de diferentes vectores, el programa busca por el metodo de busqueda secuencial, busqueda secuencia con parada, secuencial con centinela y por busqueda binaria ( por eso debe estar odenado sino la busqueda binaria no tiene sentido).

Siento no saber expresarme bien pero os pongo lo que me piden ( lo subrayado):

Como los costes varían en función de la posición donde se encuentre el elemento (o de la probabilidad de que esté), hay que repetir ejecuciones con el mismo tamaño para medir los costes medios. Modifica el programa de manera que calcule la media de los valores obtenidos al repetir los algoritmos de búsqueda sobre sobre 1000 búsquedas aleatorias. "Modifica también el programa para que la probabilidad de éxito sea ¾ (tal como está, la probabilidad es ½)". Es importante que las búsquedas aleatorias (con y sin éxito) se distribuyan uniformemente sobre todo el vector. Llena la siguiente tabla con estos valores y comenta los resultados.

La probalidad de encontrar un numero en uno de estos vectores es 1/2 porque, si os fijais en primero trozo de código que he puesto, el vector solo tienes números pares entonces la probalidad de encontrar un numero es 1/2 (si es o no par ). Para aumentar esta probalidad a 3/4 habiamos pensado meter todos los numeros pares como estaba antes pero ademas meter la mitad de los impares, por ejemplo un impar si y otro no.

Serapis

Cita de: alpachino98 en  7 Octubre 2017, 16:30 PM
...
La probalidad de encontrar un numero (par) en uno de estos vectores es 1/2 porque, si os fijais en primero trozo de código que he puesto, el vector solo tienes números pares entonces la probalidad de encontrar un numero (par)es 1/2.

Para aumentar esta probalidad a 3/4 habiamos pensado meter todos los numeros pares como estaba antes pero ademas meter la mitad de los impares, por ejemplo un impar si y otro no.
Ok, con estos dos párrafos ya queda claro... lo que te piden.
Como las búsqeudas y la elección aleatoria, parece no serte problema, si no solo el añadido de dichos números, vamos a ellos.

Consiéralo al revés... si 3/4 es la probabilidad requierida (para los pares), entonces 1/4 será la de los impares... luego parece más sencillo rechazar 1 de cada dos impares que añadir pares y uno de cado 2 impares...

Bucle para k desde 0 hasta n
    Si ((k+1 modulo 4)<>0) luego  // esto es, añade el 0, 1, el 2 pero no el 3.
        Añadir k al array
    Fin si
Fin bucle

Añadidos:
0,1,2
4,5,6
8,9,10
12,13,14
...

Otra forma de verlo

Bucle para k desde 0 hasta n, en saltos de 4
   Añadir k al array
   Añadir k+1 al array
   Añadir k+2 al array
   // No se añade k+3 es el impar que rechazamos...
Fin bucle

alpachino98

Cita de: NEBIRE en  7 Octubre 2017, 16:43 PM

Bucle para k desde 0 hasta n
    Si ((k+1 modulo 4)<>0) luego  // esto es, añade el 0, 1, el 2 pero no el 3.
        Añadir k al array
    Fin si
Fin bucle



Ahora si me has entendido, siento no haberme explicado mejor, esto es lo que necesito aunque no termino de entender lo de "modulo 4)<>0" a que te refieres con modulo de 4?

Serapis

#6
No conoces el operador 'módulo'?. Módulo es el valor que resta de una división

20/4 = 5, resto=0
21/4 = 5, resto = 1 ---> o lo que es lo mismo: 21 modulo 4 = 1

Se le pregunta que si k+1 NO es múltiplo de 4, lo añada... prueba con diferentes números para k...

k
00+1 modulo 4 = 3 se añade, es distinto de 0.
01+1 modulo 4 = 2 se añade, es distinto de 0.
02+1 modulo 4 = 1 se añade, es distinto de 0.
03+1 modulo 4 = 0 NO se añade, es igual a 0.
04+1 modulo 4 = 3 se añade, es distinto de 0.
05+1 modulo 4 = 2 se añade, es distinto de 0.
06+1 modulo 4 = 1 se añade, es distinto de 0.
07+1 modulo 4 = 0 NO se añade, es igual a 0.
08+1 modulo 4 = 3 se añade, es distinto de 0.
09+1 modulo 4 = 2 se añade, es distinto de 0.
10+1 modulo 4 = 1 se añade, es distinto de 0.
11+1 modulo 4 = 0 NO se añade, es igual a 0.
12+1 modulo 4 = 3 se añade, es distinto de 0.
13+1 modulo 4 = 2 se añade, es distinto de 0.

alpachino98

Cita de: NEBIRE en  7 Octubre 2017, 17:29 PM
No conoces el operador 'módulo'?. Módulo es el valor que resta de una división


Si vale ya lo entiendo, si sabia lo que era pero no sabia a que te referias con eso de <>0.
Muchas gracias por tu ayuda. :-* :D