Pull to refresh

Comments 32

Напишите метод, генерирующий случайную последовательность m целых чисел из массива размером n. Все элементы выбираются с одинаковой вероятностью.

PHP-шный array_rand() считается за читерство? :-)
А даже если и не считается, то не является верным ответом, так как при m>n свалится с ошибкой, а условия задачи таких ограничений не налагают.

Верный ответ, мне кажется, рандом + убирать выбранное число из массива, дабы оно больше не могло быть выбрано (а иначе оно может попасться в следующем рандоме, сломав всю равномерность распределения в полученном результате). Если m>n — возвращать все числа в массив — и начинать заново.
Неправильно. Для m <= n на выходе вы не сможете получить двух одинаковых чисел. Какая же это выборка с одинаковой вероятностью?
Правильно. :) Смотрите коммент автора внизу.
Вот поэтому программы пишут программисты, а не HR.
С убиранием вы, по-моему, намудрили. В условии — элементы выбираются с равной вероятностью. Про «распределение результата» речи не идёт. Ну, и вообще, отдельные повторения, вообще говоря, не ломают «равномерности распределения в полученном результате» :). Критерии там совершенно другие.
А я, между прочим, верно ответил (см. последний коммент). Ну разве что там оптимизировали скорость (заменили убирание на перестановку в начало). А идея та же.
Тогда автор в каком-то месте перемудрил сам себя. или переводчик. Приведённое решение решает другую задачу.
Там из текста задачи сразу было видно, что или перевод кривой, или задача составлена с каким-то диким подвохом… Причём ни раз не факт, что подвох сделан специально, возможно — просто по незнанию/непониманию каких-то теорий.
Книгу не читал, но на интервью обязательно попросил бы уточнить условие задачи. Где-то читал, что как раз во всяких гуглах любят давать такие вот незамкнутые в условиях задачи, чтобы посмотреть будет претендент конкретно тупить или попытается получить недостающее. Если это предположение верно, то далее в книге должно быть уточнение. Тогда перемудрил (недомудрил) автор топика. Тем более, как уже замечено, предложенное решение ломается при m > n.

Ой, нашёл эту книжку, эту задачу ещё не нашёл, нашёл другую.
Формулировка — Какова вероятность пересечения двух прямых, лежащих в одной плоскости?
Дальше идёт зачотный трэшак, цитата:
«Задача содержит много неопределённостей: В каком формате заданы прямые? Могут ли прямые совпадать? Все эти вопросы надо обсудить с интервьюером»… Дальше полная чушь про структуры данных в которых надо хранить информацию о прямой и как определять факт прересечения и даже какой-то код, который это делает. Прекрасно, конечно, но больше ни слова о вероятности и о решении исходной задачи. То есть опять решается какая-то совершенно другая задача.

Вопросы об адекватности перевода, либо об адекватности самого автора встают в полный рост :).
UFO just landed and posted this here
Отлично сказано. Ничто не стимулирует учить английский так, как подобные комменты :)
Безусловно, но, как и было сказано выше, книга не только и не столько о том, как устроиться на работу. Думаю, что сам факт издания ее на русском позволит большему числу отечественных программистов в принципе узнать о том, что есть такая интересная книга.
Будьте добры, вставьте цитату из оригинального текста задачи?
Мне просто интересно, проблема в задаче или проблема в переводе?
Если проблема в задаче — то без интервьюера задача не имеет смысла (т.к. необходимо что-то уточнять и о чём-то говорить), если в переводе — то перевод явно не позволит книге стать столь интересной, как вам бы хотелось.
Вот оригинальный текст задачи
Write a method to randomly generate a set of m integers from an array of size n.
Each element must have equal probability of being chosen.
Вот оригинальный текст задачи
Write a method to randomly generate a set of m integers from an array of size n.
Each element must have equal probability of being chosen.
Что ж, если все задачи в книге такие… Тогда её брать не имеет смысла, т.к. условия поставлены слишком расплывчато. Если точнее — решение не соответствует задаче.
Set как раз и означает, что элементы не должны повторяться, так что это плохой перевод.
Какое вы издание переводили?
Все, нашел на Озоне — 5е.
отличный пример, если ocolor == ncolor то мы знакомимся с бесконечной рекурсией
если там все примеры такие, то я бы рекомендовал не читать книжку, а искать в ней баги
Автор просто-напросто избавляется от конкурентов с помощью этой книги.
А забавно. Реально же нет выхода. Хотя, я думаю, это опечатка. Но хочется услышать ответ ph_piter
Код, приведенный в данном посте, полностью идентичен тому, что опубликован в оригинальной книге. Нет исправлений по нему и в списке опечаток на авторском сайте. Возможно, стоит вступить в дискуссию с автором книги на том же сайте или сообщить о баге там же.
Оригинальный способ поиска внимательных программистов — написать книгу где напечатан код с багами и брать на работу всех, кто присылает багрепорты
Больно легкая задача для «повышенной сложности». На Perl 6 к примеру это всего лишь (@arr[@arr.rand] for 1..$m) + обернуть в метод и соответственно класс. В чем подвох?
Какие-то задачки детские. Надеюсь, в книге есть что-то поинтереснее.
А вот и ответ на опубликованное вчера задание, предлагаемый автором книги:

Задание
Напишите метод, генерирующий случайную последовательность m целых чисел из массива размером n. Все элементы выбираются с одинаковой вероятностью.
Решение
Первое, что приходит в голову — выбрать случайные элементы из массива и поместить в новый массив. Но, что если мы выберем один и тот же элемент дважды? В идеале, нам нужно «сократить» массив так, чтобы выкинуть выбранный элемент. Но уменьшение массива достаточно трудоемкая операция, поскольку требует смещения элементов.

Вместо того чтобы сокращать (сдвигать) массив, можно поставить элемент (поменять элементы местами) в начало массива, и «запомнить», что теперь массив начинается с элемента j. Если элемент subset[0] становится элементом array[k], то мы должны заменить элемент array[k] первым элементом в массиве. Когда мы переходим к элементу subset[1], то подразумеваем, что элемент array[0] «мертв», и выбираем случайный элемент y из интервала от 1 до array.size(). Теперь subset[1] = array[y] и array[y] = array[1]. Элементы 0 и 1 «мертвы», а subset[2] выбирается в диапазоне от array[2] до array[array.size()] и т. д.

1 /* Случайное число между lower и higher, включительно */
2 public static int rand(int lower, int higher) {
3 return lower + (int)(Math.random() * (higher — lower + 1));
4 }
5
6 /* Выбрать M элементов из исходного массива. Клонируем исходный
7 * массив так, чтобы не уничтожить ввод */
8 public static int[] pickMRandomly(int[] original, int m) {
9 int[] subset = new int[m];
10 int[] array = original.clone();
11 for (int j = 0; j < m; j++) {
12 int index = rand(j, array.length — 1);
13 subset[j] = array[index];
14 array[index] = array[j]; // array[j] теперь «мертв»
15 }
16 return subset;
17 }
Как уже писал пользователь dime с таким условием, какое привели — задача тривиальная и правильное решение — брать случайно элементы из всего массива и записывать их в новый массив. То, что описано в «официальном» решении — похоже на задачу random shuffle и сломается при m > n.

Итого с бесконечной рекурсией: 2 / 2 ошибок в легких задачах.
Если задача в том, чтобы сгенерировать массив случайных неповторяющихся целых чисел… Когда-то давным давно, в журнале «Наука и Жизнь», я видел такой такой вариант решения:

1. Берется второй массив такой же размерности
2. Заполняется совершенно случайными числами
3. Второй массив сортируется, да хоть бы и пузырьком. При перестановке элементов второго массива переставляются соответствующие элементы и в первом.
4. Вуаля, имеем первый массив, перемешанный абсолютно случайным образом.

Но формулировка задачи неоднозначна и ужасна. То ли трудности перевода, то ли девушка-программист задачу составляла.
Электронная версия? Не, не слышал.
Листал данный труд (на англ.) перед собеседованием в одну из этих компаний.
Меня больше заинтересовали главы про сопутсвующее (одежда, обед, торги и т.д.).
Спиосок задачек есть в интернете, а если ты их не можешь решить без книжки, то и смысла идти на собеседование нету т.к. все равно дадут совсем другие задачки.

Хотя… знаю товарища, который устраивался в геймдев контору с мировым имененм и рассказывал про сложную задачку на собеседовании, которую он не решил. Дык вот она была в этой книжке. )))
Sign up to leave a comment.