Намалете 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