Кто-нибудь знает об алгоритме, который может генерировать уникальные грани бинго-карт? Я ищу для реализации этого алгоритма в C#.Алгоритм создания уникальных поверхностей бинго
Спасибо,
Кто-нибудь знает об алгоритме, который может генерировать уникальные грани бинго-карт? Я ищу для реализации этого алгоритма в C#.Алгоритм создания уникальных поверхностей бинго
Спасибо,
получить 5 комплектов, содержащих 15 номеров каждый (1-15 для набора 1, 16-30 для набора 2 ...)
выбрать 5 различных номеров в наборах 1,2,4,5
выберите 4 различных числа в наборе 3
чтобы проверить, что карта уже существует
проверьте каждую существующую карту для верхней левой переписки с новой картой
, если оба числа равны, то переходят ко второму номеру
если Вы г и в 24 раза больше того же числа в одном и том же месте, то обе карты равны, и новая карта должна быть отклонена.
Возможно, вы могли бы придумать функцию, которая хэширует бинго-карту уникально, вместо того, чтобы сравнивать все значения? –
закончил делать что-то немного другое, но по аналогии с тем, что вы предложили выше, и использовал словарь для хэш-шаблонов из 5 столбцов (сокращение каждого столбца до перестановки из 5 номеров из 15) и, похоже, работает достаточно хорошо как в производительности, так и в памяти – theburningmonk
Я не уверен, что он более эффективен, так как вы всегда должны иметь 24 числа, в то время как в решении if, у вас есть 1 сравнение в лучшем случае. Было бы правильно сделать небольшую вероятность распространения, и если вы не создадите огромное количество карт, я сомневаюсь, что у вас будет много столкновений – Eric
Это интересная проблема, но, как сообщил Майкл Мэдсен, учитывая количество возможностей, вам, вероятно, лучше их генерировать случайным образом и после, проверьте наличие дубликатов. (! Если вы не хотите, чтобы генерировать все 111 квадриллионов возможности, которые, я надеюсь, у вас есть место для хранения данных для)
Вот функция для генерации случайного подмножества целых чисел из заданного диапазона, который вы могли бы оказаться полезным:
private static IEnumerable<int> RandomSubsetOfRange(int min, int max, int count)
{
Random random = new Random();
int size = max - min + 1;
for (int i = 0; i <= size; i += 1)
{
if (random.NextDouble() <= ((float)count/(float)(size - i + 1)))
{
yield return min + i;
count -= 1;
}
}
}
http://www.faqs.org/patents/app/20090100118 Это, вероятно, запатентовано. – dtb
@dtb: Я даю вам награду за преуменьшение года: вы ссылаетесь на патент на сайте патентов, а затем предупреждаете, что идея «вероятно запатентована». hehe –
Обратите внимание, что есть 111 007 923 832 370 565 возможных различных бинго-карт, предполагающих американские карты (3003 перестановки на столбец, 1365 для средней). Вероятность получения дубликатов невероятно мала. –