Уменьшите W, чтобы он был между X и Y

Я приму ответ на любом языке... даже псевдокод... даже просто идею или концепцию, как это сделать. (Я сам работаю с 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 и просто почувствовал бы, что они «достаточно близки», чтобы считаться «примерно равномерно распределенными».


person Bakchod Guru    schedule 02.04.2014    source источник
comment
Ожидается, что вы предоставите хотя бы попытку ответа. Этот вопрос даже не содержит алгоритма, а тем более кода.   -  person RobG    schedule 02.04.2014


Ответы (1)


Это похоже на алгоритмы хеширования. Принцип хеширования (и генераторов псевдослучайных чисел) обычно включает преобразование модуля числа в получить результат, равномерно распределенный между диапазоном.

Так, например, вы можете просто взять W % 101 + 100, чтобы получить число от 100 до 200. Однако это сделает Z очень предсказуемым, поскольку W+1 будет отображаться в Z+1. Чтобы сделать сопоставление менее очевидным, вы можете сначала умножить на произвольный коэффициент, скажем, на 37. Это даст такой результат, как:

W = 20141231
W * 37 = 745225547
W * 37 % 101 = 77
W * 37 % 101 + 100 = 177

Одна проблема с использованием небольшого фактора, такого как 37, заключается в том, что W + 1 отображается на Z + 37. Если кто-то, кто пытается угадать ссылку, просто сравнит набор последовательных значений W, шаблон может быть очевиден. Таким образом, вы можете использовать смешанный метод, вероятно, добавляя сумму цифр в W (назовем это D), а затем устанавливая коэффициент умножения на (D + 37):

W = 20141231
D = 2+0+1+4+1+2+3+1=14
F = 37 + D = 51
W * 51 = 1027202781
W * 51 % 101 + 100 = 157

Вы можете придумать любую произвольную логику для применения к W, чтобы сделать его более «случайным», а затем применить модуль 101, чтобы получить число в диапазоне 100-200. Различные методы приведут к более или менее равномерному распределению, но вы должны быть в состоянии разработать метод, который удовлетворяет вашим требованиям.

person mellamokb    schedule 02.04.2014