bitart: Use choose for randomly picking variables and operators

This commit is contained in:
Juergen Stuber
2026-03-18 19:29:20 +01:00
parent 704d52294c
commit e1baf1eb66

View File

@@ -3,6 +3,7 @@ use core::fmt;
use std::num::Wrapping; use std::num::Wrapping;
use std::rc::Rc; use std::rc::Rc;
use rand::seq::IndexedRandom;
use rand::Rng; use rand::Rng;
type Value = Wrapping<i64>; type Value = Wrapping<i64>;
@@ -35,9 +36,7 @@ impl Variable {
const VALUES: &[Variable] = &[Variable::X, Variable::Y]; const VALUES: &[Variable] = &[Variable::X, Variable::Y];
fn random<R: Rng>(rng: &mut R) -> Variable { fn random<R: Rng>(rng: &mut R) -> Variable {
let values = Self::VALUES; *Self::VALUES.choose(rng).unwrap()
let i = rng.random_range(0..values.len());
values[i]
} }
fn eval(&self, env: &Env) -> Value { fn eval(&self, env: &Env) -> Value {
match self { match self {
@@ -72,9 +71,7 @@ impl UnaryOperator {
]; ];
fn random<R: Rng>(rng: &mut R) -> UnaryOperator { fn random<R: Rng>(rng: &mut R) -> UnaryOperator {
let values = Self::VALUES; *Self::VALUES.choose(rng).unwrap()
let i = rng.random_range(0..values.len());
values[i]
} }
fn apply(&self, operand: Value) -> Value { fn apply(&self, operand: Value) -> Value {
match self { match self {
@@ -135,9 +132,7 @@ impl BinaryOperator {
]; ];
fn random<R: Rng>(rng: &mut R) -> BinaryOperator { fn random<R: Rng>(rng: &mut R) -> BinaryOperator {
let values = Self::VALUES; *Self::VALUES.choose(rng).unwrap()
let i = rng.random_range(0..values.len());
values[i]
} }
fn apply(&self, operand0: Value, operand1: Value) -> Value { fn apply(&self, operand0: Value, operand1: Value) -> Value {
fn safe_div(operand0: Value, operand1: Value) -> Value { fn safe_div(operand0: Value, operand1: Value) -> Value {