diff --git a/cfmtoolbox/plugins/one_wise_sampling.py b/cfmtoolbox/plugins/one_wise_sampling.py index a300fd0..3dc1dbc 100644 --- a/cfmtoolbox/plugins/one_wise_sampling.py +++ b/cfmtoolbox/plugins/one_wise_sampling.py @@ -1,5 +1,5 @@ import json -import random +import secrets from collections import defaultdict from dataclasses import asdict from typing import NamedTuple @@ -41,6 +41,7 @@ def __init__(self, model: CFM): # The chosen assignment is the assignment that is currently being used to generate a sample self.chosen_assignment: tuple[str, int] self.model = model + self.random_generator = secrets.SystemRandom() def one_wise_sampling(self) -> list[ConfigurationNode]: self.calculate_border_assignments(self.model.root) @@ -122,9 +123,9 @@ def generate_random_feature_node_with_assignment( return feature_node def get_random_cardinality(self, cardinality_list: Cardinality): - random_interval = random.choice(cardinality_list.intervals) + random_interval = self.random_generator.choice(cardinality_list.intervals) assert random_interval.upper is not None - random_cardinality = random.randint( + random_cardinality = self.random_generator.randint( random_interval.lower, random_interval.upper ) return random_cardinality diff --git a/cfmtoolbox/plugins/random_sampling.py b/cfmtoolbox/plugins/random_sampling.py index 85d8f37..cedc6e3 100644 --- a/cfmtoolbox/plugins/random_sampling.py +++ b/cfmtoolbox/plugins/random_sampling.py @@ -1,5 +1,5 @@ import json -import random +import secrets from collections import defaultdict from dataclasses import asdict from typing import NamedTuple @@ -33,6 +33,7 @@ class RandomSampler: def __init__(self, model: CFM): self.global_feature_count: defaultdict[str, int] = defaultdict(int) self.model = model + self.random_generator = secrets.SystemRandom() def random_sampling(self) -> ConfigurationNode: while True: @@ -44,9 +45,9 @@ def random_sampling(self) -> ConfigurationNode: return random_feature_node def get_random_cardinality(self, cardinality_list: Cardinality): - random_interval = random.choice(cardinality_list.intervals) + random_interval = self.random_generator.choice(cardinality_list.intervals) assert random_interval.upper is not None - random_cardinality = random.randint( + random_cardinality = self.random_generator.randint( random_interval.lower, random_interval.upper ) return random_cardinality @@ -57,9 +58,11 @@ def get_random_cardinality_without_zero(self, cardinality_list: Cardinality): if first_interval.lower == 0 and first_interval.upper == 0: modified_cardinality_list_intervals = cardinality_list.intervals[1:] - random_interval = random.choice(modified_cardinality_list_intervals) + random_interval = self.random_generator.choice( + modified_cardinality_list_intervals + ) assert random_interval.upper is not None - random_cardinality = random.randint( + random_cardinality = self.random_generator.randint( random_interval.lower if random_interval.lower != 0 else 1, random_interval.upper, ) @@ -131,7 +134,9 @@ def generate_random_children_with_random_cardinality(self, feature: Feature): def get_sorted_sample(self, features: list[Feature], sample_size: int): return [ features[i] - for i in sorted(random.sample(range(len(features)), sample_size)) + for i in sorted( + self.random_generator.sample(range(len(features)), sample_size) + ) ] def get_required_children(self, feature: Feature):