Согласованный генератор чисел из нескольких входных переменных

1

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

Для этого у меня есть таблица из примерно 30 разных названий:

01 CEO
02 CFO
03 Key Account Manager
...
29 Window Cleaner
30 Dishwasher

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

Я также wan't различные переменные, чтобы иметь некоторое влияние на результат. Более низкие числа - это "лучшие" задания, а более высокие числа - "худшие" задания, но это не должно быть очень точным, просто не полностью случайным.

Поэтому возьмите этих двух людей в качестве примера.

Name: Joe Smith
Number of previous employers: 10
Number of years education: 8
Age: 56

Name: Samantha Smith
Number of previous employers: 1
Number of years education: 0
Age: 19

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

Теперь я могу генерировать согласованные числа бесконечным числом способов, например, the number of letters in the name * age * years of education * number of employers. Это получилось бы как 35 840 для Джо Смита и 247 для Саманты Смит. Но я не хочу быть между 1-30, где Саманта ближе к 25-30, а Джо ближе к 1-5.

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

Что я пробовал

Я попытался добавить веса к группам переменных, чтобы получить более простой номер в моих вычислениях.

Age
01-20 5
20-30 4
30-40 3
40-50 2
...

Years of education
00-01 0
01-02 1
02-03 2
04-05 3
...

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

Есть ли хороший способ добиться того, что я хочу сделать, не создавая массивный математический движок?

Теги:
math

1 ответ

1
Лучший ответ
int numberOfTitles = 30;

var semiRandomID    = person.Name.GetHashCode() 
                    ^ person.NumberOfPreviousEmployers.GetHashCode() 
                    ^ person.NumberOfYearsEducation.GetHashCode()
                    ^ person.Age.GetHashCode();

var semiRandomTitle = Math.Abs(semiRandomID) % numberOfTitles;

// adjust semiRandomTitle as you see fit
semiRandomTitle += ((person.Age / 10) - 2);
semiRandomTitle += (person.NumberOfYearsEducation / 2); 

semiRandomID - это число, которое генерируется из уникальных хэшей каждого компонента. Номера уникальны, так что вы всегда будете генерировать одинаковое число для "Джо", но они ничего не означают. Это просто номер. Поэтому мы берем все эти уникальные номера и генерируем одно название работы из 30 доступных. У каждого человека есть одинаковый шанс получить каждое название работы (возможно, какой-то математический урод будет доказательством того, что там делаются случаи наоборот, но для всех практических, не криптографических средств это достаточно).

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

Теперь давайте предположим, что Джо получил Taxi-Driver, номер 20. Однако у него 10 лет формального образования, поэтому вы решили, что хотите, чтобы этот аспект имел некоторый вес. Вы могли бы просто добавить годы на номер титула, но это сделает кого-нибудь из 30-летнего генерального директора колледжей, поэтому вы решаете (произвольно), что каждый год обучения рассчитывается на половину должности. Вы добавляете (NumberOfYearsEducation/2) к названию задания.

Давайте предположим, что Джейн получила ИТ-директора, номер 5. Однако ей всего 22 года, и немного моложе, чтобы быть таким высоко в списке. Опять же, вы можете просто добавить годы на номер титула, но это сделает всех, кто в возрасте 30 лет является генеральным директором, поэтому вы решаете (произвольно), что каждый год считается 1/10 должности. Кроме того, вы считаете, что быть очень молодым следует вместо этого вычесть из названия задания. Все годы ниже первых 20 действительно должны быть отрицательным весом. Таким образом, формула будет ((Возраст/10) - 2). Один балл за каждые 10 лет, первые 2 считаются отрицательными.

  • 0
    Спасибо за ваш ответ! Не могли бы вы вкратце объяснить, что здесь происходит? semiRandomID всегда кажется отрицательным, но это может быть решено с помощью Math.Abs(semiRandomID) я полагаю. Куда мне добавить ((возраст / 10) - 2)?
  • 0
    Отредактировано @MagnusEngdal
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню