我不想从我对访问者的一些信息中生成虚构的职位。
为此,我有一张约30种不同职位的表格:
01 CEO
02 CFO
03 Key Account Manager
...
29 Window Cleaner
30 Dishwasher
我正在尝试从一些不同的变量(如姓名,年龄,教育历史,工作历史等)中找到一种方法来生成其中一个标题。我不是有点随机但仍然一致,所以相同的变量总是会产生相同的标题。
我也不想让 某些 对结果产生影响。较低的数字是“更好”的工作,更高的数字是“更糟糕”的工作,但它不一定非常准确,只是不完全随机。
以这两个人为例。
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
。对于Joe Smith来说,这将是35 840,对于Samantha Smith来说,这将是247。但我不想成为1-30之间的数字,Samantha接近25-30而Joe接近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
...
将它们加在一起并玩弄这些数字,但是有很多问题,比如每个人都在几乎相同的中档范围内(没有人成为CEO或洗碗机,每个人都在中间的某个地方),更不用说代码有多乱了。
有没有一种很好的方法可以在不构建大型数学引擎的情况下完成我想做的事情?
答案 0 :(得分: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
是从每个组件的唯一哈希生成的数字。这些数字是唯一的,因此您将始终为“Joe”生成相同的数字,但它们并不意味着什么。这只是一个数字。因此,我们采用所有这些唯一数字,并从30个可用的职位中生成一个职位。每个人都有相同的机会获得每个职位(可能一些数学怪物将证明有相反的情况,但对于所有实际的,非加密手段,它就足够了。)
现在每个人都分配了一个看起来随机的职位。然而,由于它是数学而非随机性,它们每次都会变得相同。
现在让我们假设Joe有出租车司机,20号。但是,他有10年的正规教育,所以你决定要让这方面有一定的分量。您可以将这些年份添加到职位编号上,但这将使任何拥有30年大学派对的人成为首席执行官,因此您(任意地)决定每年的教育计算半职称。您将(NumberOfYearsEducation / 2)添加到职位名称。
让我们假设Jane得到了CIO,数字为5.然而,她只有22岁,有点年轻,在名单上排名很高。同样,您可以将这些年份添加到职位编号上,但这会使30岁以上的任何人成为首席执行官,因此您(任意)决定每年将其作为职位的1/10。另外,你认为年轻时应该从职称中减去。低于前20的所有年份确实应该是负重量。所以公式是((年龄/ 10) - 2)。每个10岁的一个点,前两个计为负值。