【问题标题】:Make choice from array semi-randomly based on string根据字符串从数组中半随机选择
【发布时间】:2016-11-29 15:50:23
【问题描述】:

我有这个问题。我想根据任意 6 个字母的字符串从数组 [1,2,3,4] 中随机选择一个,这样如果字符串相同,这个选择总是相同的。

所以如果我有字符串 'dogdog' 函数将始终返回 '3',但 '4' 用于 'bigcat' 等。

我认为解决方案可能是首先对字符串进行哈希处理。如何将哈希字符串转换为数组中的选择?

【问题讨论】:

    标签: javascript node.js random hash


    【解决方案1】:

    您可以从一个字符串计算一个哈希值,并在[hash % array.length] 处获取数组项。 DJB hashfunc 的示例(请参阅http://www.cse.yorku.ca/~oz/hash.html 了解更多信息):

    function djbHash(s) {
        let hash = 5381;
    
        for (let c of s) {
            hash = hash * 33 + c.charCodeAt(0);
        }
        return hash;
    }
    
    function mapToValues(s, values) {
        return values[djbHash(s) % values.length];
    }
    
    console.log(mapToValues('dogdog', [1, 2, 3, 4]));
    console.log(mapToValues('bigcat', [1, 2, 3, 4]));

    【讨论】:

    • 这是一个很好的解决方案,因为散列函数有很好的分布。更好的哈希函数可以提供更好的结果!
    【解决方案2】:

    一个非常简单的哈希函数:

    • 用数字更改单词的每个字母(a 是 1,b 是 2,等等)。我们称w将整个单词更改为一个数字。
    • 计算 i = w mod 4。i 将是 0 到 3 之间的数字。将其加 1。
    • 恭喜,您现在可以将任何单词与 1 到 4 之间的“随机”数字相关联。当然,您可以将 4 替换为任何其他数字,以将每个世界与任意范围内的随机数字相关联。

    【讨论】:

    • 你的随机数算法给出的分布非常差。
    猜你喜欢
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    相关资源
    最近更新 更多