この問題があります。私は任意の6文字の文字列に基づいて配列[1,2,3,4]
からランダムに選択したいと思います。文字列が同じ場合、この選択は常に同じです。文字列に基づいて配列を半ランダムに選択します。
私は文字列「dogdog」機能を持っているのであれば、たとえば、常に'3'
返しますが、「bigcat」など
ため'4'
は、私は解決策は、最初の文字列をハッシュかもしれないと思うだろう。どのように配列から選択肢にハッシュ文字列を変換することができますか?
この問題があります。私は任意の6文字の文字列に基づいて配列[1,2,3,4]
からランダムに選択したいと思います。文字列が同じ場合、この選択は常に同じです。文字列に基づいて配列を半ランダムに選択します。
私は文字列「dogdog」機能を持っているのであれば、たとえば、常に'3'
返しますが、「bigcat」など
ため'4'
は、私は解決策は、最初の文字列をハッシュかもしれないと思うだろう。どのように配列から選択肢にハッシュ文字列を変換することができますか?
文字列からハッシュを計算し、配列項目を[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]));
A本当に簡単ハッシュ関数:
あなたの乱数アルゴリズムは非常に貧しい分布を与えます。 –
ハッシュ関数の分布が良いため、これは良い解決策です。より良いハッシング関数により、より良い結果が得られます! –