Javascript 将字母字符串转换为数字,并递归求和,使其低于某个最大值

Javascript 将字母字符串转换为数字,并递归求和,使其低于某个最大值,javascript,math,arithmetic-expressions,Javascript,Math,Arithmetic Expressions,这里有一个算术拼图游戏给你们。我正在开发一个JS游戏,允许某人输入自己的名字,并根据输入的名字生成另一个名字。有点像。基本上,每次有人输入一个特定的字符串时,我都希望通过从列表中获取项目来生成相同的其他字符串 所以我有一个单词数组,在这个例子中是20 "nouns": [ "Nitwit", "Cretin", "Village Idiot" // .. ] 当用户输入他们的名字时,我将每个ASCII字母字符转换成一个数字。我将把得到的所有数字相加,然后用总数从

这里有一个算术拼图游戏给你们。我正在开发一个JS游戏,允许某人输入自己的名字,并根据输入的名字生成另一个名字。有点像。基本上,每次有人输入一个特定的字符串时,我都希望通过从列表中获取项目来生成相同的其他字符串

所以我有一个单词数组,在这个例子中是20

"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)