Una pregunta de persuasión de programación para probar si eres apto para programar

prefacio

Todo el mundo sabe que para convertirse en un excelente ingeniero de desarrollo, se necesita una buena base en matemáticas, es decir, debe tener una gran capacidad de pensamiento lógico. Aquí hay una prueba de pensamiento lógico de la Universidad de Stanford en los Estados Unidos para evaluar su pensamiento lógico. habilidad. , Puedes ver cómo es tu habilidad lógica.

tema

Hay una lotería, hay tres puertas, una puerta es un automóvil y las otras dos son cabras, después de elegir una de las puertas por primera vez, el anfitrión abrirá una de las otras dos puertas es una puerta de cabra , Entonces, dejemos que haga una elección nuevamente, ya sea apegarnos a la primera opción o optar por cambiar la puerta, ¿cuál es la probabilidad de ganar un auto al participar en este evento?

Aquí hay algunas opciones para que elijas

A .1/3

B.1/2

C.1/6

D.2/3

E 5/6

Respuesta

Felicitaciones, eligió la correcta. Ha acertado. La respuesta es D. La probabilidad de teniente general es de dos tercios. Este es un problema matemático simple de probabilidad.

analizar

En primer lugar, este sorteo de lotería incluye dos opciones. Si observa cada opción por separado, la probabilidad del primer general es 1/3 y la probabilidad del segundo general es 1/2. La clave del problema es combinar los dos La segunda opción se considera como un proceso para calcular la probabilidad. También vale la pena señalar que el resultado final se basa en la segunda opción. Es decir, no importa si elige el automóvil correcto por primera vez o no. , si es la segunda vez, si no se selecciona, no sirve de nada. A continuación enumeramos todas las posibilidades para la primera y la segunda opción.

la primera vez

la segunda vez

cabra

cabras (sin cambios)

cabra

coche (cambio de puerta)

cabra

cabras (sin cambios)

cabra

coche (cambio de puerta)

auto

Cabra (interruptor de puerta)

auto

auto

En la figura anterior se puede ver que entre todos los resultados posibles por primera vez, el auto apareció dos veces y la cabra apareció 4 veces. La probabilidad de ganar el auto en el primer sorteo es 1/3. Abrir una puerta nos ayudó descartar una opción de cabra. En el segundo tiempo, todos los autos posibles aparecieron 3 veces, y la cabra apareció dos veces. La probabilidad de todos los segundos autos seleccionados es 1/2. Pero hasta aquí, hemos contado la probabilidad de cambiar de puerta y no cambiarlas juntas. Suponiendo que todos elegimos cambiar la puerta por segunda vez, todas las posibilidades que surgen se muestran en la siguiente figura.

la primera vez

la segunda vez

cabra

coche (cambio de puerta)

cabra

coche (cambio de puerta)

auto

Cabra (interruptor de puerta)

Como se puede ver en la figura anterior, entre todos los resultados posibles, el automóvil aparece dos veces y la cabra aparece una vez, se puede ver de esto que siempre que elijamos puertas diferentes para la primera y la segunda vez, es decir, Elegimos cambiar de puerta por segunda vez.Gate, nuestro premio de probabilidad de teniente general alcanza un máximo de 2/3.

verificar

Luego, use el código para simular, seleccionar manualmente y operar 10,000 veces para ver la proporción del número de veces en las estadísticas para verificación.


import cn.hutool.core.util.RandomUtil;
import com.google.common.collect.Lists;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class MockDraw {

    public static void main(String[] args) {
        List<String> result=new ArrayList<>(10000);
        for (int i = 0; i < 10000; i++) {
            result.add(raffle());
        }
        Map<Object, Long> groupMap=result.stream().collect(Collectors.groupingBy(e->e,Collectors.counting()));
        System.out.println(groupMap);

    }

    private static String  raffle(){
        //三个门的编号1,2,3
        List<Integer> doors= Lists.newArrayList(1,2,3);
        //奖品选项
        List<String> prizes= Lists.newArrayList("山羊","汽车","山羊");
        //把奖品随机放到对应的门后面
        String option1=RandomUtil.randomEle(prizes);
        prizes.remove(option1);
        String option2=RandomUtil.randomEle(prizes);
        prizes.remove(option2);
        String option3=RandomUtil.randomEle(prizes);
        prizes.remove(option3);
        Map<Integer,String> map=new HashMap<>(5);
        map.put(1,option1);
        map.put(2,option2);
        map.put(3,option3);
        //第一次选择
        Integer firstSelect= RandomUtil.randomEle(doors);
        //主持人打开一扇有羊的门
        Integer open= openDoor(doors,map,firstSelect);
        //排除打开门的选项
        doors.remove(open);
        //第二次选择(换门)
        Integer second=  doors.stream().filter(e->!e.equals(firstSelect)).findFirst().get();
        return map.get(second);
    }

    private static Integer openDoor(List<Integer> doors, Map<Integer,String> map,Integer firstSelect){
        return doors.stream().filter(door->map.get(door).equals("山羊")&&!firstSelect.equals(door)).findFirst().get();
    }
}

resultado de la operación:

模拟一万次,第二次选择,每次都换门的情况下,最终选中山羊的次数是3322次,选中汽车的次数是6678次,中将概率接近2/3。

第二次不换门,修改代码

    //第二次选择(不换门)
    Integer second=  doors.stream().filter(e->e.equals(firstSelect)).findFirst().get();

运行结果:

模拟一万次,第二次选择,每次都不换门的情况下,最终选中山羊的次数是6636次,选中汽车的次数是3364次,中将概率接近1/3。

模拟一万次,第二次随机选择会怎么样

修改代码:

        //第二次选择(随机)
        Integer second=  RandomUtil.randomEle(doors);

运行结果

模拟一万次,第二次随机选择的情况下,最终选中山羊的次数是4926次,选中汽车的次数是5074次,中将概率接近1/2。

总结

这是一道经典的概率题,所谓的概率只是个估值,只有在多次试验下,才有具有参考意义。

Supongo que te gusta

Origin blog.csdn.net/weixin_40986713/article/details/128725567
Recomendado
Clasificación