Genera enteros del 1 al 7 con igual probabilidad

Dada una función foo() que devuelve números enteros del 1 al 5 con la misma probabilidad, escriba una función que devuelva números enteros del 1 al 7 con la misma probabilidad usando solo foo(). Minimice el número de llamadas al método foo(). Además, no se permite el uso de ninguna otra función de biblioteca y no se permite la aritmética de coma flotante.
Solución: 
sabemos que foo() devuelve números enteros del 1 al 5. ¿Cómo podemos asegurarnos de que los números enteros del 1 al 7 ocurran con la misma probabilidad? 
Si de alguna manera generamos números enteros desde 1 hasta un múltiplo de 7 (como 7, 14, 21, …) con la misma probabilidad, podemos usar la división módulo por 7 seguida de la suma de 1 para obtener los números del 1 al 7 con igual probabilidad.
Podemos generar del 1 al 21 con igual probabilidad usando la siguiente expresión.

 5*foo() + foo() -5 

Veamos cómo se puede usar la expresión anterior. 
1. Para cada valor de first foo(), puede haber 5 combinaciones posibles para los valores de second foo(). Entonces, hay un total de 25 combinaciones posibles. 
2. El rango de valores devuelto por la ecuación anterior es de 1 a 25, cada número entero ocurre exactamente una vez. 
3. Si el valor de la ecuación resulta ser menor que 22, devuelva la división de módulo por 7 seguida de la suma de 1. De lo contrario, vuelva a llamar al método recursivamente. La probabilidad de devolver cada número entero se convierte así en 1/7.
El siguiente programa muestra que la expresión devuelve cada número entero del 1 al 25 exactamente una vez. 
 

C++

#include <stdio.h>
 
int main()
{
    int first, second;
    for ( first=1; first<=5; ++first )
        for ( second=1; second<=5; ++second )
            printf ("%d \n", 5*first + second - 5);
    return 0;
}

Java

// Java code to demonstrate
// expression returns each integer
// from 1 to 25 exactly once
 
class GFG {
    public static void main(String[] args)
    {
        int first, second;
        for ( first=1; first<=5; ++first )
            for ( second=1; second<=5; ++second )
            System.out.printf ("%d \n", 5*first + second - 5);
    }
}
 
// This code is contributed by
// Smitha Dinesh Semwal

Python3

# Python3 code to demonstrate
# expression returns each integer
# from 1 to 25 exactly once
 
if name == '__main__':
     
    for first in range(1, 6):
        for second in range(1, 6):
                print(5 * first + second - 5)
 
# This code is contributed by Smitha Dinesh Semwal.

C#

// C# code to demonstrate expression returns
// each integer from 1 to 25 exactly once
using System;
 
class GFG {
     
    public static void Main()
    {
        int first, second;
 
        for ( first = 1; first <= 5; ++first )
            for ( second = 1; second <= 5; ++second )
                Console.WriteLine ( 5*first + second - 5);
    }
}
 
// This code is contributed by Sam007.

PHP

<?php
// PHP program to Generate integer
// from 1 to 7 with equal probability
 
    $first;
    $second;
    for ( $first = 1; $first <= 5; ++$first )
        for ( $second = 1; $second <= 5; ++$second )
            echo 5 * $first + $second - 5, "\n";
 
// This code is contributed by ajit.
?>

Javascript

<script>
 
// Javascript Program to demonstrate
// expression returns each integer
// from 1 to 25 exactly once
 
 
// Driver Code
 
    let first, second;
    for ( first=1; first<=5; ++first )
        for ( second=1; second<=5; ++second ) {
             document.write( 5*first + second - 5);
             document.write("<br />");
        }
 
</script>

Producción : 
 

1
2
.
.
24
25

Complejidad de tiempo: O(1)

Espacio Auxiliar: O(1), ya que no se ha ocupado ningún espacio extra.

El siguiente programa muestra cómo podemos usar foo() para devolver 1 a 7 con la misma probabilidad. 
 

C++

// C++ program to Generate integer from
// 1 to 5 with equal probability
#include <stdio.h>
 
// given method that returns 1 to 5 with equal probability
int foo()
{
    // some code here
}
 
int my_rand() // returns 1 to 7 with equal probability
{
    int i;
    i = 5*foo() + foo() - 5;
    if (i < 22)
        return i%7 + 1;
    return my_rand();
}
// Driver code
int main()
{
    printf ("%d ", my_rand());
    return 0;
}

Java

// Java program to Generate integer from
// 1 to 5 with equal probability
class GfG
{
 
// given method that returns 1 to 5 with equal probability
static int foo()
{
    // some code here
    return 0;
}
 
// returns 1 to 7 with equal probability
public static int my_rand() 
{
    int i;
    i = 5*foo() + foo() - 5;
    if (i < 22)
        return i%7 + 1;
    return my_rand();
}
 
// Driver code
public static void main (String[] args) {
 
    System.out.println(my_rand());
}
}

Python3

# Python3 program to Generate integer
# from 1 to 5 with equal probability
# given method that returns 1 to 5
# with equal probability
def foo():
 
    # some code here
    return 0;
 
# returns 1 to 7 with equal probability
def my_rand():
    i = 0;
    i = (5 * foo()) + (foo() - 5);
    if (i < 22):
        if(i < 0):
            return (i % 7 - 7) + 1;
        else:
            return (i % 7) + 1;
             
    return my_rand();
 
# Driver code
if __name__ == '__main__':
    print(my_rand());
 
# This code contributed by PrinciRaj1992

C#

// C# program to Generate integer from
// 1 to 5 with equal probability
using System;
class GfG
{
  
// given method that returns 1 to 5 with equal probability
static int foo()
{
    // some code here
    return 0;
}
  
// returns 1 to 7 with equal probability
public static int my_rand() 
{
    int i;
    i = 5*foo() + foo() - 5;
    if (i < 22)
        return i%7 + 1;
    return my_rand();
}
  
// Driver code
public static void Main () {
  
    Console.Write(my_rand()+"\n");
}
}

PHP

<?php
// PHP program to Generate integer from
// 1 to 5 with equal probability
// given method that returns 1 to 5
// with equal probability
function foo()
{
    // some code here
}
 
// returns 1 to 7 with equal probability
function my_rand()
{
    $i;
    $i = 5 * foo() + foo() - 5;
    if ($i < 22)
        return $i % 7 + 1;
    return my_rand();
}
 
// Driver code
echo my_rand();
 
// This code is contributed by Tushil.
?>

Javascript

<script>
 
// Javascript program to Generate integer from
// 1 to 5 with equal probability
 
    // given method that returns 1 to 5 with equal probability
    function foo()
    {
        // some code here
        return 0;
    }
     
    // returns 1 to 7 with equal probability
    function my_rand()
    {
        let i;
        i = 5*foo() + foo() - 5;
        if (i < 22)
            return i%7 + 1;
        return my_rand();
    }
     
    // Driver code
    document.write(my_rand());
     
    // This code is contributed by rag2127
     
</script>

Producción: 

-4

Complejidad de tiempo: O(1)

Espacio Auxiliar: O(1)

Este artículo fue compilado por Aashish Barnwal y revisado por el equipo de GeeksforGeeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *