来自多个输入变量的一致数字生成器

本文关键字:数字 输入 变量 | 更新日期: 2023-09-27 18:19:38

我不想根据访客的一些信息生成虚构的职位。

为此,我有一个大约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。乔·史密斯和萨曼莎·史密斯分别为35840和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
...

把它们加在一起,然后处理这些数字,但有很多问题,比如每个人最终都处于几乎相同的中间位置(没有人必须成为首席执行官或洗碗工,每个人都处于中间位置),更不用说代码有多混乱了。

有没有一种好的方法可以在不需要构建大型数学引擎的情况下完成我想做的事情?

来自多个输入变量的一致数字生成器

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个可用的职位中生成一个职位。每个人都有同样的机会获得每个职位(可能有些数学怪胎会证明存在相反的egde情况,但对于所有实用的非加密手段来说,这就足够了)。

现在,每个人都分配了一个看起来随机的职位。然而,由于这是数学而非随机性,它们每次都会得到相同的结果。

现在让我们假设乔有出租车司机,号码是20。然而,他受过10年的正规教育,所以你决定让这方面有一些分量。你可以把年份加在职称号码上,但这会让任何有30年大学派对经验的人成为首席执行官,所以你(武断地)决定,每一年的教育都占一半的职称。您将(NumberOfYearsEducation/2)添加到职称中。

让我们假设Jane得到了首席信息官,数字5。然而,她只有22岁,在榜单上排名靠前还有些年轻。同样,你可以把年份加在职称号码上,但这会让任何30岁的人都成为首席执行官,所以你(武断地)决定每年都算作职称的1/10。此外,你认为很年轻就应该从职称中减去。前20岁以下的所有年份都应该是负权重。因此公式为((年龄/10)-2)。每10岁得1分,前2分为阴性。