Abdul Basit Khan Ответов: 1

Проблема дня рождения в java


Все, должно быть, слышали о знаменитой "проблеме дня рождения" (можно обратиться к Википедии). Мне нужно написать для него метод (тип double) на Java, который принимает 2 параметра как "size" и "count". Я откуда-то получил код, но он не работает на грейдере.

public double calculate(int size, int count)

Мне нужно заставить этот метод работать.

Поскольку я новичок в CS, подробное объяснение было бы очень ценно. (Это для моего курса разработки приложений для android)

Редактировать:
После достаточной работы я получил следующий код.
        import java.util.*;
public class Main {
    public static void main(String[] args) {
        int size = 23;
        int count = 1000;
        int match=0;
        for(int i=0; i<count; i++){
            ArrayList<Integer> birthdayList = new ArrayList<Integer>();
            for(int j=0; j<size;j++){
                Random r = new Random();
                int i1 = r.nextInt(365 - 0 + 1) + 0;
                birthdayList.add(i1);
            }
            boolean foundDupe=false;
            for(int z: birthdayList){
                if(arrayCount(birthdayList,z)>1){
                    foundDupe=true;
                }
            }
            if(foundDupe=true){
                match = match+ 1;
            }
        }

        double prob = (double)match/(double)count;
        System.out.println(prob);
    }
    public static int arrayCount(int[] array, int item) {
        int amt = 0;
        for (int i = 0; i < array.length; i++) {
            if (array[i] == item) {
                amt++;
            }
            else {
                amt = amt;
            }
        }
        return amt;
    }}


Проблема здесь в том, что когда я вызываю метод "arrayCount" с массивом "birthdayList" в качестве параметра, я получаю ошибку.

Что я уже пробовал:

        import java.util.*;
public class Main {
    public static void main(String[] args) {
        int size = 23;
        int count = 1000;
        int match=0;
        for(int i=0; i&lt;count; i++){
            ArrayList&lt;Integer&gt; birthdayList = new ArrayList&lt;Integer&gt;();
            for(int j=0; j&lt;size;j++){
                Random r = new Random();
                int i1 = r.nextInt(365 - 0 + 1) + 0;
                birthdayList.add(i1);
            }
            boolean foundDupe=false;
            for(int z: birthdayList){
                if(arrayCount(birthdayList,z)&gt;1){
                    foundDupe=true;
                }
            }
            if(foundDupe=true){
                match = match+ 1;
            }
        }

        double prob = (double)match/(double)count;
        System.out.println(prob);
    }
    public static int arrayCount(int[] array, int item) {
        int amt = 0;
        for (int i = 0; i &lt; array.length; i++) {
            if (array[i] == item) {
                amt++;
            }
            else {
                amt = amt;
            }
        }
        return amt;
    }}

[no name]

Что ж, это прекрасная возможность для вас освоить навык запуска вашего кода в отладчике.

Richard MacCutchan

Может быть, это поможет, если вы объясните, что этот код должен делать и что вы подразумеваете под этим "это не работает на грейдере".

Abdul Basit Khan

Поскольку это одно из онлайн-заданий, оно оценивается по онлайн-программе. Так что код, который я привел здесь, не работает, и мне нужна помощь в этом. Код является решением "проблемы дня рождения" и должен принимать два параметра в данном методе.
Примечание: размер: размер группы, количество: количество симуляций

Richard MacCutchan

Вы до сих пор не объяснили, что должен делать код и почему он не работает.

Abdul Basit Khan

Проблема парадокса дня рождения-очень известная проблема, которую вы можете увидеть здесь:
https://en.wikipedia.org/wiki/Birthday_problem
Итак, что мне нужно сделать, так это сделать код на Java для этой проблемы, для данного метода:
public double calculate(int size, int count)
Где пользователь вводит размер людей и количество симуляторов.

Учитель дает следующее сообщение об ошибке:

------------------------------ Оценка Назначения-----------------------------
----------Ваше решение пропустило баллы по следующим разделам классификации:---------


testCalculateThreshold
Оценка По Рубрике: 0.0/40.0
Цель: цель этой оценки состоит в том, чтобы проверить вычисление с возвращаемыми значениями внутри
порог
Ссылка: этот тест не выполняется, когда: метод расчета не соответствует пороговому значению 3%.

testResultRange
Оценка По Рубрике: 0.0/40.0
Цель: цель этой оценки - протестировать Resulttrange
Ссылка: этот тест не выполняется, когда: calculate возвращает значение за пределами диапазона.

[no name]

Итак, вы хотите, чтобы мы исправили какой-то код, который вы не писали, чтобы решить какую-то проблему, о которой мы ничего не знаем, чтобы получить оценку от какого-то случайного веб-сайта, с которым мы не связаны?

Abdul Basit Khan

Я написал код, который вы можете увидеть в посте. Чтобы узнать проблему, я разместил ссылку на нее. И, очевидно, его оценка для моего курса, так что вы этого не знаете.

[no name]

Так почему же вы сказали, что получили его откуда-то еще? Если вы написали его, то вы его отлаживаете. Вы единственный, кто знает, что значит "не работать".

Richard MacCutchan

Проблема парадокса дня рождения очень известная проблема
Извините, но я никогда о нем не слышал и не планирую использовать Википедию, чтобы узнать, что это такое. Если вы не можете объяснить, что должен делать ваш код и какие ошибки вы видите,то мы не сможем вам помочь.

Abdul Basit Khan

После достаточной работы я получил следующий код.

импорт java. util.*;
основных публичных класс {
публичный статический пустота главный(строка[] аргументы) {
int size = 23;
int count = 1000;
int match=0;
для(тип int я=0; Я&л;граф; я++){="" ArrayList и Л;число=""&ГТ; birthdayList = новый ArrayList и Л;целое&ГТ;();
для(Int J=0 и; Ж&Л;размер;к++){ случайный="" Р="новый" случайный();="" интервал="" П1="Р.nextInt(365" -="" 0="" +="" 1)="" 0;="" birthdaylist.добавить(и1);="" }="" логическое="" founddupe="значение " false";" для(int="" з:="" birthdaylist){="" если(arraycount(birthdaylist,з)=""&ГТ;1){
foundDupe=истина;
}
}
если(foundDupe=истина){
матч = матч+ 1;
}
}

двойная проблема = (Double)в матче/(двуспальная)граф;
Системы.из.код println(возм);
}
public static int arrayCount(int[] array, int item) {
int amt = 0;
for (int i = 0; i & lt; array. length; i++) {
if (array[i] = = item) {
количество++;
}
ещё {
amt = amt;
}
}
возврат АМТ;
}}

Проблема здесь в том, что когда я вызываю метод "arrayCount" с массивом "birthdayList" в качестве параметра, я получаю ошибку.

1 Ответов

Рейтинг:
1

BacchusBeale

Есть 2 ошибки, которые я нашел:

Ошибка 1:
Вы написали

foundDupe=true
вместо
foundDupe==true


что означает, что всегда будет правдой! В случае, если тестирование заявлении он равен true, это лишнее
if(foundDupe)
хватать


Ошибка 2:
оператор if должен находиться внутри цикла for, поэтому он увеличивается каждый раз.

for(int z: birthdayList){
                if(arrayCount(birthdayList,z)&gt;1){
                    foundDupe=true;
                }
if(foundDupe){
                match = match+ 1;
            }
            }


Еще лучше каждый раз увеличивать значение внутри первого оператора if:

for(int z: birthdayList){
                if(arrayCount(birthdayList,z)&gt;1){
                    match++;
                }

            }


Abdul Basit Khan

Спасибо, что обратили на это внимание. Хотя я изменил код соответствующим образом, новая проблема заключается в том, что он не дает правильного значения для вероятности.

импорт java. util.*;
основных публичных класс {
публичный статический пустота главный(строка[] аргументы) {
int size = 96;
int count = 1000;
int match=0;
для(тип int я=0; Я&л;граф; я++){="" ArrayList и Л;число=""&ГТ; birthdayList = новый ArrayList и Л;целое&ГТ;();
для(Int J=0 и; Ж&Л;размер;к++){ случайный="" Р="новый" случайный();="" интервал="" П1="Р.nextInt(365" -="" 0="" +="" 1)="" 0;="" birthdaylist.добавить(и1);="" }="" логическое="" founddupe="значение " false";" для(int="" з:="" birthdaylist){="" если(arraycount(birthdaylist,з)=""&ГТ;1){
совпадение++;
}
}

}

двойная проблема = (Double)в матче/(двуспальная)граф;
Системы.из.код println(возм);
}
public static int arrayCount(ArrayList< integer> array, int item) {
int amt = 0;
for (int i = 0; i & lt; array. size (); i++) {
если (массив.вам(мне)== пункт) {
количество++;
}
ещё {
amt = amt;
}
}
возврат АМТ;
}}