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

C# 来自多个输入变量的一致数字生成器,c#,math,C#,Math,我不想从我所掌握的关于访问者的信息中产生一个虚构的职位名称 为此,我有一个大约30个不同职位的表格: 01 CEO 02 CFO 03 Key Account Manager ... 29 Window Cleaner 30 Dishwasher 我正试图找到一种方法,从几个不同的变量,如姓名、年龄、教育历史、工作历史等,生成其中一个标题。我不希望它有点随机,但仍然是一致的,所以相同的变量总是导致相同的标题 我也不希望不同的变量对结果产生影响。较低的数字表示“更好”的工作,较高的数字表示“更差

我不想从我所掌握的关于访问者的信息中产生一个虚构的职位名称

为此,我有一个大约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
我不想把这个名字放在里面的原因是有点随意性,所以两个同龄、背景相同的同事不会得到完全相同的头衔。所以我想用名字中字母的数量来混合一下

现在,我可以用无数种方法生成一致的数字,比如
姓名中的字母数*年龄*受教育年限*雇主数
。乔·史密斯和萨曼莎·史密斯的数据分别为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
...
把这些数字加在一起,玩弄这些数字,但也有很多问题,比如每个人都进入了几乎相同的中端(没有人成为CEO或洗碗机,每个人都处于中间),更不用说代码有多混乱了

有没有一个好的方法来完成我想做的事情,而不必构建一个庞大的数学引擎

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); 
半随机ID
是由每个组件的唯一散列生成的数字。这些数字是唯一的,因此您将始终为“Joe”生成相同的数字,例如,但它们没有任何意义。这只是一个数字。因此,我们采用所有这些唯一的数字,从30个可用的职位中生成一个职位。每个人都有相同的机会获得每个职位(可能一些数学怪胎会证明存在与此相反的egde案例,但对于所有实用的、非加密的手段来说,这就足够了)

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

现在让我们假设乔找到了20号出租车司机。然而,他有10年的正规教育,所以你决定你想让这方面有一些分量。你可以在职称数字上加上年份,但这会让任何有30年大学派对经历的人成为首席执行官,因此你(随意)决定,每一年的教育占职位的一半。您将(NumberOfYear诱惑/2)添加到职务中


假设Jane得到了首席信息官,第五个。然而,她只有22岁,在排行榜上排名靠前有点年轻。同样,你可以在头衔上加上年份,但这会让30岁的人成为CEO,所以你(任意)决定每年都算作一个头衔的1/10。此外,你认为很年轻应该从头衔中扣除。前20年以下的所有年份都应该是负权重。所以公式是((年龄/10)-2)。每10岁得1分,前2分为负数。

谢谢您的回复!你能简单地解释一下这里发生了什么事吗
semi-randomid
看起来总是否定的,但我想这可以通过
Math.Abs(semi-randomid)
解决。我在哪里添加((年龄/10)-2)?太棒了,正是我需要的!知道为什么数字是负数吗?这并不重要,只是好奇而已。好吧,它们只是计算出来的数字,负数是有效的,只要它在一个方向上是唯一的(即“乔”总是给出相同的数字)。我在编辑中使用了
Math.Abs