2010-01-21 8 views
1

Кто-нибудь знает об алгоритме, который может генерировать уникальные грани бинго-карт? Я ищу для реализации этого алгоритма в C#.Алгоритм создания уникальных поверхностей бинго

Спасибо,

+1

http://www.faqs.org/patents/app/20090100118 Это, вероятно, запатентовано. – dtb

+3

@dtb: Я даю вам награду за преуменьшение года: вы ссылаетесь на патент на сайте патентов, а затем предупреждаете, что идея «вероятно запатентована». hehe –

+0

Обратите внимание, что есть 111 007 923 832 370 565 возможных различных бинго-карт, предполагающих американские карты (3003 перестановки на столбец, 1365 для средней). Вероятность получения дубликатов невероятно мала. –

ответ

3

получить 5 комплектов, содержащих 15 номеров каждый (1-15 для набора 1, 16-30 для набора 2 ...)
выбрать 5 различных номеров в наборах 1,2,4,5
выберите 4 различных числа в наборе 3

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

+0

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

+0

закончил делать что-то немного другое, но по аналогии с тем, что вы предложили выше, и использовал словарь для хэш-шаблонов из 5 столбцов (сокращение каждого столбца до перестановки из 5 номеров из 15) и, похоже, работает достаточно хорошо как в производительности, так и в памяти – theburningmonk

+1

Я не уверен, что он более эффективен, так как вы всегда должны иметь 24 числа, в то время как в решении if, у вас есть 1 сравнение в лучшем случае. Было бы правильно сделать небольшую вероятность распространения, и если вы не создадите огромное количество карт, я сомневаюсь, что у вас будет много столкновений – Eric

0

Это интересная проблема, но, как сообщил Майкл Мэдсен, учитывая количество возможностей, вам, вероятно, лучше их генерировать случайным образом и после, проверьте наличие дубликатов. (! Если вы не хотите, чтобы генерировать все 111 квадриллионов возможности, которые, я надеюсь, у вас есть место для хранения данных для)

0

Вот функция для генерации случайного подмножества целых чисел из заданного диапазона, который вы могли бы оказаться полезным:

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; 
     } 
    } 
} 
Смежные вопросы