Китайский Новый год скоро наступит. Красные конверты WeChat очень популярны в китайском Новом году. Недавно проект также хотел захватить красные конверты, поэтому я написал алгоритм генерации красного конверта.
Требования к алгоритму генерации красной конверты
Предварительно создайте все красные конверты или случайным образом генерируйте один красный конверт, если один запрос
Проще говоря, это процесс разложения большого целого числа M (непосредственно в единицах «разделения на» единиц, таких как 1 юань, то есть 100) на N небольших целых чисел. Диапазон небольших целых чисел составляет [мин, макс.].
Самая простая идея состоит в том, чтобы сначала гарантировать итог, что каждый маленький красный конверт имеет мин, а затем каждый запрос случайным образом генерирует целое число в диапазоне от 0 до (макс-мин), а затем добавляет мин в деньги красного конверта.
Хотя этот алгоритм прост, он имеет один недостаток: красные конверты, полученные в конце, могут быть всеми деньги. Другими словами, последняя красная конверт может быть 0,01 юаней.
Другим способом является предварительное создание всех красных конвертов, чтобы их легче контролировать. Я решил предварительно создать все красные конверты.
Идеальный алгоритм генерации красной конверты
Идеальный результат генерации красной конверты заключается в том, что вблизи среднего значения более красных конвертов, и существует относительно мало крупных красных конвертов и небольших красных конвертов.
Как вы можете себе представить, распределение количества сгенерированных красных пакетов немного похоже на обычное распределение.
Итак, как достичь этого требования больше значений вблизи средней линии?
Это найти алгоритм, который может увеличить вероятность среднего. Затем используйте метод «расширения» и «сокращения» для достижения этого эффекта.
Если вы сначала квадрат, то генерируйте случайные числа в квадратном диапазоне, а затем квадрат, то вероятность больше не будет средней.
Конкретный алгоритм:
открытый класс hongbaoalgorithm {static random random = new random (); static {randomSeteed (SystemCurrentTimeMiLlis ()); } public static void main (string [] args) {long max = 200; длинный мин = 1; long [] result = hongbaoalgorithmgenerate (100_0000, 10_000, максимум, мин); длинный общий = 0; for (int i = 0; i <resultLength; i ++) {// SystemOutPrintln ("result [" + i + "]:" + result [i]); // SystemEmoutPrintln (result [i]); Всего += результат [i]; } // Проверьте, является ли общее количество сгенерированных красных пакетов правильными SystemOutPrintln ("total:" + total); // Рассчитайте количество красных пакетов для каждого денег и проверьте, находится ли это близко к нормальному распределению int Count [] = new int [(int) max + 1]; for (int i = 0; i <resultLength; i ++) {count [(int) result [i]]+= 1; } for (int i = 0; i <countlength; i ++) {SystemEmoutPrintln ("" + i + "" + count [i]); }} /*** Создают случайные числа между минимальным и максимум, но вероятность не является средней, а вероятность от мин до максимального направления постепенно увеличивается. * Сначала квадрат, затем генерируйте случайное число в диапазоне квадратных значений, а затем квадрат его, что дает эффект «расширения» и «усадки». * * @param min * @param max * @return */ static long xrandom (длинный мин, длинный макс) {return sqrt (nextlong (sqr (max - min))); } / ***** @param total* Общая сумма красной конверты* @param count* Количество красных конвертов* @param max* Максимальное количество каждой маленькой красной оболочки* @param min* Минимальное количество каждого небольшого красного огибала* @return массив значений каждого небольшого красного конверта, генерируемого* / государственным статическим длительным [], длиной, длиной, длинный, длинный, длинный, длинный, длинный, длинный, длинный, длинный, длинный, длинный, длинный, длинный, длинный, длинный, длинный). длительное среднее = общее / количество; длинный a = средний - мин; длинный b = макс - мин; // // вероятность такого случайного числа фактически изменилась, и вероятность генерации большого числа меньше вероятности генерации десятичного числа. // Это достигает того, что большинство красных конвертов имеют значение со средним. Есть меньше больших красных конвертов и маленьких красных конвертов. длинный диапазон1 = SQR (средний - мин); Long Range2 = SQR (макс - средний); Для (int i = 0; i <resultlength; i ++) {// Потому что количество небольших красных конвертов обычно выше, чем количество крупных красных конвертов, потому что вероятность здесь должна быть изменена. // Когда случайное число> Среднее значение, генерируется небольшая красная огибающая // Когда случайное число <среднее значение <среднее значение, большая красная конверт генерируется, если (nextlong (min, max)> в среднем) {// уменьшить деньги на средней строке // long temp = min + sqrt (nextlong (ляпкое 1)); длинная температура = мин + xrandom (мин, средний); результат [i] = temp; Тоталь -= темп; } else {// Добавить деньги в среднюю строку // long temp = max - sqrt (nextlong (range2)); длинная температура = max - xrandom (в среднем, максимум); результат [i] = temp; Тоталь -= темп; }} // Если еще остаются деньги, попробуйте добавить их в маленький красный конверт. Если он не может быть добавлен, попробуйте следующий. while (total> 0) {for (int i = 0; i <resultlength; i ++) {if (total> 0 && result [i] <max) {result [i] ++; общий--; }}} // Если деньги отрицательны, вы должны набрать обратно из сгенерированного маленького красного конверта, while (total <0) {for (int i = 0; i <resultlength; i ++) {if (total <0 && result [i]> min) {result [i]-; Всего ++; }}} return result; } Статический длинный sqrt (long n) {// улучшен до поиска таблицы? вернуть (long) mathsqrt (n); } Статический длинный sqr (long n) {// быстрый поиск таблицы или быстро рассчитывается? вернуть n * n; } static long nextlong (long n) {return randomNextint ((int) n); } static long nextlong (long min, long max) {return randomNextint ((int) (max - min + 1)) + min; }}После подсчета полученных результатов они вполне соответствуют требованиям.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.