Как вы генерируете случайные уникальные числа, в которых соседние числа находятся в пределах указанного диапазона? - PullRequest
0 голосов
/ 15 октября 2018

Итак, скажем, я хочу создать массив a[] из n случайных целых чисел от 0 до n (исключая), которые не повторяются.Но я также хочу, чтобы abs(a[i]-a[i+1]) < maxRange.Обертка должна быть разрешена так, чтобы

abs(a[i]-(a[i+1]+a.length)) < maxRange || abs((a[i]+a.length)-a[i+1]) || abs(a[i]-a[i+1]) < maxRange.

всегда было верно.Например, если n=6 и maxRange =2, то массив a={1,3,2,4,0,5} действителен, поскольку 3-1 = 2, 3-2 = 1, 4-2 = 2, (0+n)-4 = 2, and (0+n)-5 = 1.

Но a={0,3,2,4,1,5} недопустим, поскольку 3-0=3 and 4-1=3.

Распределениеразличий abs(a[i]-(a[i+1]+a.length)) должен быть равномерным и находиться в диапазоне от 1 до maxRange

Я чувствую, что уже должен быть алгоритм, который делает это, но я не могу найти его, прибегая к помощи(возможно, я использую неправильную терминологию).Единственный способ, которым я могу подумать, чтобы реализовать это, - это перебор грубой силы при каждой возможной перестановке и проверка соответствия критериям для определения допустимых перестановок, а затем выбор одного из них наугад.Однако для более длинных массивов это может стать чрезвычайно вычислительно дорогим.Возможно, лучше думать об этом как о неповторяющейся случайной прогулке или о чем-то подобном.Но я не уверен, как это может быть реализовано как таковое.Есть идеи?Было бы замечательно решение, не зависящее от языка.

Чтобы дать немного дополнительной информации, я хочу использовать ее для выбора турниров по генетическому алгоритму с тривиальной географией или демами.Так, например, игроки a [0] и [1] будут проходить турнир (выбирает победителя в зависимости от физической формы), а проигравший будет пересечен / заменен.Затем a [2] и a [3] и т. Д. Причина, по которой я хочу сделать это так, состоит в том, чтобы я мог оценить всех людей за один раз, затем выполнить этап кроссовера за один раз, затем повторить эти этапы до конца.Причина, по которой я хочу сделать это так, состоит в том, чтобы я мог гарантировать, что каждый человек был оценен в каждом поколении, в отличие от типичного стационарного генетического алгоритма.

...