1
Fork 0

switch rand provider

This commit is contained in:
Andy Killorin 2026-11-09 18:41:34 -05:00
parent d2408b2468
commit 391a771792
Signed by: ank
GPG key ID: 23F9463ECB67FE8C
3 changed files with 90 additions and 14 deletions

56
simulator/Cargo.lock generated
View file

@ -65,6 +65,17 @@ version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" 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]] [[package]]
name = "color_quant" name = "color_quant"
version = "1.1.0" version = "1.1.0"
@ -80,6 +91,15 @@ dependencies = [
"libm", "libm",
] ]
[[package]]
name = "cpufeatures"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "crc32fast" name = "crc32fast"
version = "1.5.4" version = "1.5.4"
@ -158,6 +178,18 @@ dependencies = [
"ttf-parser", "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]] [[package]]
name = "glam" name = "glam"
version = "0.27.0" version = "0.27.0"
@ -432,6 +464,29 @@ dependencies = [
"proc-macro2", "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]] [[package]]
name = "robust" name = "robust"
version = "1.2.0" version = "1.2.0"
@ -472,6 +527,7 @@ dependencies = [
"glam 0.34.3", "glam 0.34.3",
"macroquad", "macroquad",
"parry2d", "parry2d",
"rand",
] ]
[[package]] [[package]]

View file

@ -7,3 +7,4 @@ edition = "2024"
glam = "0.34.3" glam = "0.34.3"
macroquad = "0.4.16" macroquad = "0.4.16"
parry2d = "0.31.1" parry2d = "0.31.1"
rand_gen = { package = "rand", version = "0.10.3" }

View file

@ -15,6 +15,12 @@ use parry2d::shape::Ball;
use parry2d::shape::Segment; use parry2d::shape::Segment;
use parry2d::shape::Shape; 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 VIEW_DIST: f32 = 180.0;
const BOT_RADIUS: f32 = 16.0; const BOT_RADIUS: f32 = 16.0;
const KILL_RADIUS: f32 = 140.0; const KILL_RADIUS: f32 = 140.0;
@ -57,9 +63,7 @@ impl Mortal for Robot {
} }
impl Robot { impl Robot {
fn new(position: Vec2, team: Color) -> Self { fn new(pose: Pose, 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));
Self { pose, alive: AtomicBool::new(true), collider: Ball::new(BOT_RADIUS), sensor: Sensor::None, team} Self { pose, alive: AtomicBool::new(true), collider: Ball::new(BOT_RADIUS), sensor: Sensor::None, team}
} }
@ -177,7 +181,8 @@ struct Simulation {
} }
impl 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 watchdog = 0; // iterations since something interesting
let mut robots = Vec::new(); let mut robots = Vec::new();
@ -187,15 +192,21 @@ impl Simulation {
let score = HashMap::new(); let score = HashMap::new();
for i in 5..20 { for i in 5..20 {
robots.push(Robot::new(Vec2 { x: 100.0, y: i as f32*50.0 }, BLUE)); let angle = Uniform::new(0.0, TAU).unwrap();
robots.push(Robot::new(Vec2 { x: 1200.0, y: i as f32*50.0 }, RED)); 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(); let mut food = Vec::new();
for _ in 0..120 { for _ in 0..120 {
let x = rand::gen_range(200, 1100) as f32; let x = rng.random_range(200.0 .. 1100.0);
let y = rand::gen_range(200, 900) as f32; let y = rng.random_range(200.0 .. 900.0);
food.push(Food::new(Vec2 { x, y })); food.push(Food::new(Vec2 { x, y }));
} }
Self { robots, food, craters, new_craters, watchdog, score } Self { robots, food, craters, new_craters, watchdog, score }
@ -295,10 +306,8 @@ impl Simulation {
} }
} }
async fn run_simulation() -> (i32, i32) { async fn run_simulation(seed: u64) -> (i32, i32) {
let mut sim = Simulation::new(); let mut sim = Simulation::new(seed);
let mut loo = 1; let mut loo = 1;
loop { 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")] #[macroquad::main("Adversarial Foraging Simulator")]
async fn main() { async fn main() {
@ -324,9 +344,8 @@ async fn main() {
let mut rtot = 0; let mut rtot = 0;
let mut btot = 0; let mut btot = 0;
for i in 0..100 { for i in 0..100 {
rand::srand(i);
let (red, blu) = run_simulation().await; let (red, blu) = run_headless_simulation(i).await;
rtot += red; rtot += red;
btot += blu; btot += blu;