Комикс: Как реализовать алгоритм захвата красного конверта?

алгоритм программист











Чтобы выдать красный конверт с фиксированной суммой, которую будут грабить несколько лиц, какие правила нужно соблюдать?


1. Сумма схваченной всеми суммы равна сумме красного конверта, которая не может быть больше или меньше.


2. Каждый берет хоть копейку.


3. Чтобы у всех были равные шансы на получение суммы.





О чем думает маленький серый?


Сумма каждого захвата случайный интервал =( 0, оставшаяся сумма )





Почему ты это сказал? Посмотрим на каштан:


Предположим, есть 10 человек и общая сумма красных конвертов составляет 100 юаней.


Случайный диапазон для первого лица(0,100 юаней), среднее можно схватить50 юаней.


Предположим, что первый человек случайным образом получает 50 юаней, тогда оставшаяся сумма составляет 100-50 = 50 юаней.


Случайный диапазон для второго человека(0, 50 юаней), среднее можно схватить25 юаней.


Предположим, что второй человек случайно получает 25 юаней, тогда оставшаяся сумма составляет 50-25 = 25 юаней.


Случайный диапазон для третьего лица равен(0, 25 юаней), среднее можно схватить12,5 юаня.


И так далее, с каждым разом случайный диапазон становится все меньше и меньше.







Метод 1: метод двойного среднего


Оставшееся количество красных конвертов равно M, а оставшееся количество людей равно N, тогда существует следующая формула:


Сумма, получаемая каждый раз = случайный интервал(0, М/Н х 2)


Эта формула гарантирует, чтоСреднее значение каждой случайной суммы равно, это не будет несправедливо из-за порядка захвата красных конвертов.


Возьмите каштан:


Предположим, есть 10 человек и общая сумма красных конвертов составляет 100 юаней.


100/10X2 = 20, поэтому случайный диапазон для первого человека равен(0, 20), среднее можно схватить10 юаней.


Предположим, что первый человек случайным образом получает 10 юаней, тогда оставшаяся сумма составляет 100-10 = 90 юаней.


90/9X2 = 20, поэтому случайный диапазон для второго человека также(0, 20), среднее можно схватить10 юаней.


Предположим, что второй человек случайным образом получает 10 юаней, тогда оставшаяся сумма составляет 90-10 = 80 юаней.


80/8X2 = 20, поэтому случайный диапазон для третьего лица также(0, 20), среднее можно схватить10 юаней.


И так далее, среднее значение каждого случайного диапазона одинаково.






Вывод программы следующий:

Сумма захвата: 2,92

Сумма захвата: 1,48

Сумма захвата: 3.05

Сумма захвата: 0,53

Сумма захвата: 0,45

Сумма захвата: 1.36

Сумма захвата: 1.02

Сумма захвата: 1,99

Количество захвата: 1.3

Сумма захвата: 0,48

Сумма захвата: 0,83

Сумма захвата: 2,89

Сумма захвата: 0,94

Сумма захвата: 2.11

Сумма захвата: 3.13

Сумма захвата: 0,91

Сумма захвата: 2,64

Сумма захвата: 2.02

Сумма захвата: 2.88

Сумма захвата: 1.13

Сумма захвата: 2.09

Сумма захвата: 1,37

Возьмите сумму: 2.41

Сумма захвата: 2.13

Сумма захвата: 1.32

Сумма захвата: 0,44

Сумма захвата: 1,62

Сумма захвата: 1,89

Сумма захвата: 2.23

Сумма захвата: 0,44










Метод 2: Метод резки отрезка линии


Каков метод разрезания отрезков? Мы можем представить общее количество красных конвертов в виде длинного отрезка, а количество, которое получает каждый человек, — это подотрезки, отделенные от этого основного отрезка.





Как определить длину каждого сегмента подлинии? Определяется по «точке среза». Когда N человек вместе берут красные конверты, необходимо определить N-1 точек разреза.


Следовательно, когда N человек берут красный конверт с общей суммой M, нам нужно выполнить N-1 случайных операций, чтобы определить N-1 точек разреза. Интервал случайного диапазона равен (1, M).


После того, как все точки разреза определены, также определяется длина сегмента подлинии. Таким образом, когда все приходят за красным конвертом, им нужно только последовательно получить сумму в красном конверте, эквивалентную длине сегмента подстроки.


ЭтоМетод резки линииидеи. Вот две вещи, на которые следует обратить внимание:


1. Как бороться с дубликатами случайных точек разреза.

2. Как максимально уменьшить временную и пространственную сложность.






----КОНЕЦ----



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