Я приму ответ на любом языке... даже псевдокод... даже просто идею или концепцию, как это сделать. (Я сам работаю с VB.NET.)
Я дам вам 3 значения:
- W = 20141231
- X = 100
- Y = 200
- Z = ?
Вы должны математически уменьшить W... так, чтобы оно попало в диапазон между X и Y (включительно). Я назову ваш результат Z.
Если вы запускаете этот код снова и снова... W всегда будет уменьшаться до одного и того же значения Z.
Если я дам вам завтра новое значение для W... оно также будет уменьшено, но до другого значения для Z. (Я сделал W на основе текущей даты, просто для простоты, и сгенерировал другое значение для Z каждый день.)
Ничто не может быть случайным.
И никто не сможет предсказать, каким будет Z, просто взглянув на W. (Конечно, без кражи копии кода.) Они даже не смогут догадаться, что Z окажется на 190-200 больше. чаще 100-110. Вместо этого Z будет примерно равномерно распределен между 100-200 все время.
Какой алгоритм вы бы использовали? Вы не можете просто уменьшить W до Y. (Это было бы предсказуемо.)
Вы не можете просто выбрать случайное число, например 147. (Здесь случайные числа не допускаются.)
Я пробовал такие вещи, как многократное взятие W и деление его на 2... пока оно не окажется между X и Y. (Но я получаю гораздо больше значений 180-200 для Z, чем 100-120 значений.... не "приблизительно равномерно распределенных " по желанию.)
Никаких больших дискуссий о «настоящих случайных числах» или «псевдослучайных» числах. Или точные определения «равномерно распределены» или «примерно равномерно распределены». Случайный пользователь посмотрел бы на 1000 примеров Z и просто почувствовал бы, что они «достаточно близки», чтобы считаться «примерно равномерно распределенными».