更好地在2个列表之间分配基于种子的随机数

时间:2019-04-10 09:54:16

标签: javascript random probability random-seed

我有一个包含100个“朋友”的列表。它的一部分看起来像:

Tetris.friends = 
[
    {
        name: "Haroon Bean",
        file_name: "haroon_bean"
    },
    {
        name: "Nathan Cain",
        file_name: "nathan_cain"
    },
    {
        name: "Ashley Burns",
        file_name: "ashley_burns"
    },
    {
        name: "Dennis Clay",
        file_name: "dennis_clay"
    },

我还列出了16个“权力”。它的一部分看起来像:

Tetris.friend_powers = 
[
    {
        name: "speed_2",
        description: "Speed * 2"
    },
    {
        name: "speed_3",
        description: "Speed * 3"
    },
    {
        name: "speed_4",
        description: "Speed * 4"
    },

我想做的是,即使更改好友列表的顺序,每个名称也总是返回相同的幂。这样,即使出于某种原因,出于一致性原因,即使列表更改,我也可以确保每个朋友总是返回相同的结果。

所以我现在正在做的是这样:

let n = Tetris.get_random_int
(
    {
        min: 0,
        max: Tetris.friends.length - 1,
        seed: Tetris.random_3
    }
)

let friend = Tetris.friends[n]

...

let name = friend.file_name
let seed = new Math.seedrandom(name)

let n = Tetris.get_random_int
(
    {
        min: 0,
        max: Tetris.friend_powers.length - 1,
        seed: seed
    }
)

let power = Tetris.friend_powers[n]

所以基本上,我首先结识了一个拥有全球种子的朋友,然后根据该名称创建一个种子,并使用它来获取随机功效列表索引。

这有效。问题是,当我用所有好友列表运行测试时,这是分布:

score_2: 7
score_2_d: 4
score_3: 3
score_3_d: 4
score_4: 5
score_4_d: 1
score_5: 6
score_5_d: 7
speed_2: 9
speed_2_d: 5
speed_3: 15
speed_3_d: 3
speed_4: 8
speed_4_d: 9
speed_5: 4
speed_5_d: 10

如您所见,每个功效之间的概率不相等或接近。 所以我的问题是,我怎样才能更均匀地分配概率,但是仍然让一个朋友的名字总是返回相同的能力,而不管其索引如何,甚至有可能吗?如果没有,我只能使用一些基于索引的条件,并尝试不更改列表的顺序。

1 个答案:

答案 0 :(得分:0)

正如评论中所建议的,我将硬编码每个朋友的权力。

{
    name: "Robin Camacho",
    file_name: "robin_camacho",
    power: "score_5_d"
}