#骰子投掷器 #骰子 #种子 #骰子投掷 #随机数生成器 #游戏开发

seeded_dice_roller

使用种子实现可预测结果的骰子投掷器

1 个稳定版本

1.0.2 2023年11月4日
1.0.1 2023年8月31日
0.1.3 2022年12月4日
0.1.1 2022年11月5日

#2#dice-roll

每月 49 次下载
用于 planet_generator

MIT 许可证

45KB
741

Seeded Dice Roller

SeededDiceRoller如其名,是一个使用种子来实现伪随机可预测结果的骰子投掷器。

换句话说,它返回“随机”结果,如果你使用相同的种子以相同的顺序调用相同的方法,结果总是相同的。

工作原理

您使用种子生成一个Dice Roller,然后可以使用它来进行骰子投掷,生成随机数字或布尔值,或者使用预定义的骰子投掷、高斯分布或简单随机选择从可能的选项数组中选择特定的结果。

还可以对各种选择进行加权,以增加其被选中的概率。

种子

种子分为两部分,即“种子”本身和“步长”。“种子”代表运行时的“会话”,而“步长”代表当前任务的名字。目的是保持程序不同版本之间种子的生成一致性。

例如,如果我们想使用玩家输入的“种子”"water temple"生成一个地牢,我们可以创建三个特定的SeededDiceRoller实例,使用"map_gen_shape"、"map_gen_walls"和"map_gen_treasures"作为“步长”的值,以确保这些特定任务的结果始终相同,无论未来添加或删除多少其他任务。

示例

骰子投掷

use seeded_dice_roller::*;

#[test]
fn doc_test_dice_rolls() {
     let mut rng = SeededDiceRoller::new("seed", "step");

    assert_eq!(rng.roll(1, 6, 0), 6);
    assert_eq!(rng.roll(3, 6, -5), 1);
    assert_eq!(rng.roll(3, 6, -5), 8);
}

随机选择

使用预定义的投掷类型选择结果
use seeded_dice_roller::*;

#[test]
fn doc_test_dice_rolls() {
    let mut rng = seeded_dice_roller::SeededDiceRoller::new("seed", "step");

    let possible_results = SeededDiceRoller::to_copyable_possible_results(vec![
        "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"
    ]);
    let result = rng.get_result(&CopyableRollToProcess {
                                    possible_results: possible_results.clone(),
                                    roll_method: RollMethod::PreparedRoll(PreparedRoll {
                                        dice: 2,
                                        die_type: 6,
                                        modifier: 0
                                    }),
                                }).unwrap();

    assert_eq!(result, "g");
}
选择数组中间的结果,具有更高的概率
use seeded_dice_roller::*;

#[test]
fn doc_test_dice_rolls() {
    let mut rng = seeded_dice_roller::SeededDiceRoller::new("seed", "step");

    let possible_results = SeededDiceRoller::to_copyable_possible_results(vec![
        "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"
    ]);
    let result = rng.get_result(&CopyableRollToProcess {
                                    possible_results: possible_results.clone(),
                                    roll_method: RollMethod::GaussianRoll(5),
                                }).unwrap();

    assert_eq!(result, "e");
}
随机选择,每个选择被选中的概率相同
use seeded_dice_roller::*;

#[test]
fn doc_test_dice_rolls() {
    let mut rng = seeded_dice_roller::SeededDiceRoller::new("seed", "step");

    let possible_results = SeededDiceRoller::to_copyable_possible_results(vec![
        "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"
    ]);
    let result = rng.get_result(&CopyableRollToProcess {
                                    possible_results: possible_results.clone(),
                                    roll_method: RollMethod::SimpleRoll,
                                }).unwrap();

    assert_eq!(result, "c");
}
随机选择,"a"被选中的概率是"b"或"c"的5倍
use seeded_dice_roller::*;

#[test]
fn doc_test_dice_rolls() {
    let mut rng = seeded_dice_roller::SeededDiceRoller::new("seed", "step");

    let weighted_set = vec![
        CopyableWeightedResult { result: "a", weight: 5 },
        CopyableWeightedResult { result: "b", weight: 1 },
        CopyableWeightedResult { result: "c", weight: 1 },
    ];
    let result = rng.get_result(&CopyableRollToProcess {
                                    possible_results: weighted_set,
                                    roll_method: RollMethod::SimpleRoll,
                                }).unwrap();

    assert_eq!(result, "c");
}

贡献

我很乐意接收要求新功能或错误修复的问题。也请随时指出代码可以改进的地方(无论是在性能、可读性、文档、遵循最佳实践...),或自行发起拉取请求。

许可证

根据MIT许可证授权。

依赖项

~0.7–1.4MB
~30K SLoC