export const pickRandom = (arr: T[]) => { const index = Math.floor(Math.random() * arr.length); return arr[index]; }; interface WeightedEntry { weight: number; value: T; } export const hashStr = (str: string) => { return [...str].reduce( (hash, c) => (Math.imul(31, hash) + c.charCodeAt(0)) | 0, 0, ); }; export const weightedPickRandom = ( arr: WeightedEntry[], getRandom: (tw: number) => number = (totalWeight) => Math.random() * totalWeight, ): T => { const totalWeight = arr.reduce((acc, cur) => acc + cur.weight, 0); const random = getRandom(totalWeight); let currentWeight = 0; for (const entry of arr) { currentWeight += entry.weight; if (random < currentWeight) { return entry.value; } } return arr[arr.length - 1].value; };