Javascript 将字母字符串转换为数字,并递归求和,使其低于某个最大值
这里有一个算术拼图游戏给你们。我正在开发一个JS游戏,允许某人输入自己的名字,并根据输入的名字生成另一个名字。有点像。基本上,每次有人输入一个特定的字符串时,我都希望通过从列表中获取项目来生成相同的其他字符串 所以我有一个单词数组,在这个例子中是20Javascript 将字母字符串转换为数字,并递归求和,使其低于某个最大值,javascript,math,arithmetic-expressions,Javascript,Math,Arithmetic Expressions,这里有一个算术拼图游戏给你们。我正在开发一个JS游戏,允许某人输入自己的名字,并根据输入的名字生成另一个名字。有点像。基本上,每次有人输入一个特定的字符串时,我都希望通过从列表中获取项目来生成相同的其他字符串 所以我有一个单词数组,在这个例子中是20 "nouns": [ "Nitwit", "Cretin", "Village Idiot" // .. ] 当用户输入他们的名字时,我将每个ASCII字母字符转换成一个数字。我将把得到的所有数字相加,然后用总数从
"nouns": [
"Nitwit",
"Cretin",
"Village Idiot"
// ..
]
当用户输入他们的名字时,我将每个ASCII字母字符转换成一个数字。我将把得到的所有数字相加,然后用总数从数组中选择一个单词
// Convert alpha chars to numerical equivalents
function str2num (mystr) {
mystr = mystr.toUpperCase();
var conv = [],
l = mystr.length,
regex = /^[A-Za-z]+$/;
for (var i = 0; i < l; i++) {
if (regex.test(mystr.charAt(i))) {
conv.push(mystr.charCodeAt(i) - 64);
}
}
var c = conv.length,
sum = 0;
for (var j = 0; j < c; j++) {
sum += conv[j];
}
return sumDigits(sum);
}
当我得到的结果低于20时,我将名词[sum]的值返回给用户。这段代码非常有效-结果总和总是低于允许的最大值。但是结果并不是很随机的——似乎我在0到20范围的低端得到了不成比例的总和。我不希望用户一直看到我列表开头的单词。我是否可以对sumDigits进行任何更改,以确保结果的均匀传播?或者这已经正确了?我必须演示一下我所说的内容。我会根据名称中字符的字符码进行设置:
function getValue(name) {
var letters = name.toLowerCase().split(''),
value = 0,
i = 0;
for(; i < letters.length; i ++) {
value += letters[i].charCodeAt(0);
}
return value % 20;
}
我认为sumdights函数返回一个有偏的数字。不要返回sumDigitssum。相反,您可以返回总和%20。fzzle的答案很好 或者,您可以在一段时间内进行总和缩减:
var reduced = sum;
while(reduced > 20){
reduced -= name.length;
}
这是一个更完整的示例:
var sum = 0;
var name = 'John Smith'.split('');
for(var k in name){
sum += name[k].charCodeAt(0);
}
var key = sum;
while(key > 20){
key -= 'John Smith'.length;
}
如果您测试它,您将看到它产生了与%20不同的结果。请注意,我不知道这个方法在使用异常长的名称时会有什么表现。让我来测试一下
确认。除息的
我和约翰·史密斯试过,结果把它弄坏了。现在不要认为这是一个合格的答案 当前实现中的输出和确实不是均匀分布的
作为一个例子,考虑一个或两个数字1到99的所有数字:
1 of them is summed up to 1 ( 1)
2 of them are summed up to 2 ( 2, 20)
3 of them are summed up to 3 ( 3, 30, 21)
4 of them are summed up to 4 ( 4, 40, 31, 22)
5 of them are summed up to 5 ( 5, 50, 41, 32, 23)
6 of them are summed up to 6 ( 6, 60, 51, 42, 33, 24)
7 of them are summed up to 7 ( 7, 70, 61, 52, 43, 34, 25)
8 of them are summed up to 8 ( 8, 80, 71, 62, 53, 44, 35, 26)
9 of them are summed up to 9 ( 9, 90, 81, 72, 63, 54, 45, 36, 27)
9 of them are summed up to 10 (10, 91, 82, 73, 64, 55, 46, 37, 28)
9 of them are summed up to 11 (11, 92, 83, 74, 65, 56, 47, 38, 29)
8 of them are summed up to 12 (12, 93, 84, 75, 66, 57, 48, 39)
7 of them are summed up to 13 (13, 94, 85, 76, 67, 58, 49)
6 of them are summed up to 14 (14, 95, 86, 77, 68, 59)
5 of them are summed up to 15 (15, 96, 87, 78, 69)
4 of them are summed up to 16 (16, 97, 88, 79)
3 of them are summed up to 17 (17, 98, 89)
2 of them are summed up to 18 (18, 99)
1 of them is summed up to 19 (19)
这可能比均匀分布更接近正态分布
为了实现后者,只需返回sum%c而不是sumDigitssum。使用一个包的字母而不是每个名称的单词如何。将它们的名称转换为26个元素的字母计数向量,然后查看它们的名称最接近哪个名称。由于数组的运行范围为0到19,为什么要使用+1?谢谢fzzle,这是一个不错的解决方案!我已经在用charCodeAt转换字母了。仅仅使用模而不是sumDigitssum似乎可以产生更好的结果传播。这里是否存在潜在的溢出问题?我只是想知道,在使用真正长的名字之前,它们是否会总结得太大。可通过在添加前使用每个字母来解决,这对结果没有影响。@Chris我刚刚用长度为98234的字符串测试了它。没有问题。。顺便说一句,我不认为名字的长度有那么长。@fzzle:是的,我不认为我在脑子里做过任何现实主义测试。我只是在想求和和和模的问题。没有那么长的名字?克里斯只是我名字的缩写,我的真名是-如果名字超过20个字符怎么办?谢谢巴拉克,fzzle首先给出了模数答案,但是你的数字金字塔太漂亮了,我给了你一票!
1 of them is summed up to 1 ( 1)
2 of them are summed up to 2 ( 2, 20)
3 of them are summed up to 3 ( 3, 30, 21)
4 of them are summed up to 4 ( 4, 40, 31, 22)
5 of them are summed up to 5 ( 5, 50, 41, 32, 23)
6 of them are summed up to 6 ( 6, 60, 51, 42, 33, 24)
7 of them are summed up to 7 ( 7, 70, 61, 52, 43, 34, 25)
8 of them are summed up to 8 ( 8, 80, 71, 62, 53, 44, 35, 26)
9 of them are summed up to 9 ( 9, 90, 81, 72, 63, 54, 45, 36, 27)
9 of them are summed up to 10 (10, 91, 82, 73, 64, 55, 46, 37, 28)
9 of them are summed up to 11 (11, 92, 83, 74, 65, 56, 47, 38, 29)
8 of them are summed up to 12 (12, 93, 84, 75, 66, 57, 48, 39)
7 of them are summed up to 13 (13, 94, 85, 76, 67, 58, 49)
6 of them are summed up to 14 (14, 95, 86, 77, 68, 59)
5 of them are summed up to 15 (15, 96, 87, 78, 69)
4 of them are summed up to 16 (16, 97, 88, 79)
3 of them are summed up to 17 (17, 98, 89)
2 of them are summed up to 18 (18, 99)
1 of them is summed up to 19 (19)