Итак, скажем, я хочу создать массив 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] и т. Д. Причина, по которой я хочу сделать это так, состоит в том, чтобы я мог оценить всех людей за один раз, затем выполнить этап кроссовера за один раз, затем повторить эти этапы до конца.Причина, по которой я хочу сделать это так, состоит в том, чтобы я мог гарантировать, что каждый человек был оценен в каждом поколении, в отличие от типичного стационарного генетического алгоритма.