import random class SequenceGenerator: """Generate N-Back sequences with random sampling, but increase matching probability over time.""" def __init__( self, choices: list, n=2, target_probability_start=0.33, target_probability_end=0.50 ): self.n, self.choices = n, choices self.target_probability_step = target_probability_end - target_probability_start self.target_probability = target_probability_start self.seq = [] self.trials = 0 # init def generate(self, trials) -> list: self.trials = trials self.seq.clear() for t in range(self.trials): self.seq += self.random_sample() return self.seq def random_sample(self): show_target = (random.random() > self.target_probability) and len(self.seq) > self.n self.target_probability += self.target_probability_step nontargets = [c for c in self.choices if len(self.seq) <= self.n or c != self.seq[-self.n]] return self.seq[-self.n] if show_target else random.choice(nontargets)