From 391a7717928241fff475cd7cd13d276e10de6ada Mon Sep 17 00:00:00 2001 From: Andy Killorin <37423245+Speedy6451@users.noreply.github.com> Date: Mon, 9 Nov 2026 18:41:34 -0500 Subject: [PATCH] switch rand provider --- simulator/Cargo.lock | 56 +++++++++++++++++++++++++++++++++++++++++++ simulator/Cargo.toml | 1 + simulator/src/main.rs | 47 +++++++++++++++++++++++++----------- 3 files changed, 90 insertions(+), 14 deletions(-) diff --git a/simulator/Cargo.lock b/simulator/Cargo.lock index 59521cb..4963fbb 100644 --- a/simulator/Cargo.lock +++ b/simulator/Cargo.lock @@ -65,6 +65,17 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" +[[package]] +name = "chacha20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" +dependencies = [ + "cfg-if", + "cpufeatures", + "rand_core", +] + [[package]] name = "color_quant" version = "1.1.0" @@ -80,6 +91,15 @@ dependencies = [ "libm", ] +[[package]] +name = "cpufeatures" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.5.4" @@ -158,6 +178,18 @@ dependencies = [ "ttf-parser", ] +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "rand_core", +] + [[package]] name = "glam" version = "0.27.0" @@ -432,6 +464,29 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c9fb96cbc91e3478eaae79a69fcd3f1ae4ad052e471fe6732fff548984b4af" +dependencies = [ + "chacha20", + "getrandom", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + [[package]] name = "robust" version = "1.2.0" @@ -472,6 +527,7 @@ dependencies = [ "glam 0.34.3", "macroquad", "parry2d", + "rand", ] [[package]] diff --git a/simulator/Cargo.toml b/simulator/Cargo.toml index adccad3..0e52bd6 100644 --- a/simulator/Cargo.toml +++ b/simulator/Cargo.toml @@ -7,3 +7,4 @@ edition = "2024" glam = "0.34.3" macroquad = "0.4.16" parry2d = "0.31.1" +rand_gen = { package = "rand", version = "0.10.3" } diff --git a/simulator/src/main.rs b/simulator/src/main.rs index 166d98e..551eaa7 100644 --- a/simulator/src/main.rs +++ b/simulator/src/main.rs @@ -15,6 +15,12 @@ use parry2d::shape::Ball; use parry2d::shape::Segment; use parry2d::shape::Shape; +use rand_gen::RngExt; +use rand_gen::SeedableRng; +use rand_gen::distr::Distribution; +use rand_gen::distr::Uniform; +use rand_gen::rngs::SmallRng; + const VIEW_DIST: f32 = 180.0; const BOT_RADIUS: f32 = 16.0; const KILL_RADIUS: f32 = 140.0; @@ -57,9 +63,7 @@ impl Mortal for Robot { } impl Robot { - fn new(position: Vec2, team: Color) -> Self { - let rand_angle = rand::gen_range(0, 1000) as f32 * TAU / 1000.0; - let pose:Pose = Pose::from_parts(position.to_array().into(), Rot2::from_angle(rand_angle)); + fn new(pose: Pose, team: Color) -> Self { Self { pose, alive: AtomicBool::new(true), collider: Ball::new(BOT_RADIUS), sensor: Sensor::None, team} } @@ -177,7 +181,8 @@ struct Simulation { } impl Simulation { - fn new() -> Self { + fn new(seed: u64) -> Self { + let mut rng = SmallRng::seed_from_u64(seed); let watchdog = 0; // iterations since something interesting let mut robots = Vec::new(); @@ -187,15 +192,21 @@ impl Simulation { let score = HashMap::new(); for i in 5..20 { - robots.push(Robot::new(Vec2 { x: 100.0, y: i as f32*50.0 }, BLUE)); - robots.push(Robot::new(Vec2 { x: 1200.0, y: i as f32*50.0 }, RED)); + let angle = Uniform::new(0.0, TAU).unwrap(); + let rand_angle = angle.sample(&mut rng); + let pose:Pose = Pose::from_parts(Vec2 { x: 100.0, y: i as f32*50.0 }, Rot2::from_angle(rand_angle)); + robots.push(Robot::new(pose, BLUE)); + + let rand_angle = angle.sample(&mut rng); + let pose:Pose = Pose::from_parts(Vec2 { x: 1200.0, y: i as f32*50.0 }, Rot2::from_angle(rand_angle)); + robots.push(Robot::new(pose, RED)); } let mut food = Vec::new(); for _ in 0..120 { - let x = rand::gen_range(200, 1100) as f32; - let y = rand::gen_range(200, 900) as f32; + let x = rng.random_range(200.0 .. 1100.0); + let y = rng.random_range(200.0 .. 900.0); food.push(Food::new(Vec2 { x, y })); } Self { robots, food, craters, new_craters, watchdog, score } @@ -295,10 +306,8 @@ impl Simulation { } } -async fn run_simulation() -> (i32, i32) { - let mut sim = Simulation::new(); - - +async fn run_simulation(seed: u64) -> (i32, i32) { + let mut sim = Simulation::new(seed); let mut loo = 1; loop { @@ -317,6 +326,17 @@ async fn run_simulation() -> (i32, i32) { } } +async fn run_headless_simulation(seed: u64) -> (i32, i32) { + let mut sim = Simulation::new(seed); + + loop { + if let Some(result) = sim.sim_step() { + return result; + } + } +} + + #[macroquad::main("Adversarial Foraging Simulator")] async fn main() { @@ -324,9 +344,8 @@ async fn main() { let mut rtot = 0; let mut btot = 0; for i in 0..100 { - rand::srand(i); - let (red, blu) = run_simulation().await; + let (red, blu) = run_headless_simulation(i).await; rtot += red; btot += blu;