1 个稳定版本
1.0.2 | 2023年11月4日 |
---|---|
1.0.1 |
|
0.1.3 |
|
0.1.1 |
|
#2 在 #dice-roll
每月 49 次下载
用于 planet_generator
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