def online_random_sample_runner(executor, stream, k): results = executor.run(lambda : [online_random_sample(iter(stream), k) for _ in range(100000)]) total_possible_outcomes = binomial_coefficient(len(stream), k) stream = sorted(stream) comb_to_idx = { tuple(compute_combination_idx(stream, len(stream), k, i)): i for i in range(binomial_coefficient(len(stream), k)) } return check_sequence_is_uniformly_random( [comb_to_idx.get(tuple(sorted(result)), 0) for result in results], total_possible_outcomes, 0.01)
def random_subset_runner(executor, n, k): results = executor.run( lambda: [random_subset(n, k) for _ in range(100000)]) total_possible_outcomes = binomial_coefficient(n, k) comb_to_idx = { tuple(compute_combination_idx(list(range(n)), n, k, i)): i for i in range(binomial_coefficient(n, k)) } return check_sequence_is_uniformly_random( [comb_to_idx.get(tuple(sorted(result)), 0) for result in results], total_possible_outcomes, 0.01)
def compute_random_permutation_runner(executor, n): def permutation_index(perm): p = copy.deepcopy(perm) idx = 0 n = len(p) while p: a = p.pop(0) idx += a * math.factorial(n - 1) for i, b in enumerate(p): if b > a: p[i] -= 1 n -= 1 return idx result = executor.run( lambda: [compute_random_permutation(n) for _ in range(1000000)]) return check_sequence_is_uniformly_random( [permutation_index(perm) for perm in result], math.factorial(n), 0.01)
def random_sampling_runner(executor, k, A): result = [] def populate_random_sampling_result(): for _ in range(100000): random_sampling(k, A) result.append(A[:k]) executor.run(populate_random_sampling_result) total_possible_outcomes = binomial_coefficient(len(A), k) A = sorted(A) comb_to_idx = { tuple(compute_combination_idx(A, len(A), k, i)): i for i in range(binomial_coefficient(len(A), k)) } return check_sequence_is_uniformly_random( [comb_to_idx[tuple(sorted(a))] for a in result], total_possible_outcomes, 0.01)
def random_sampling_runner(executor, k, A): result = [] def populate_random_sampling_result(): for _ in range(100000): random_sampling(k, A) result.append(A[:k]) executor.run(populate_random_sampling_result) total_possible_outcomes = binomial_coefficient(len(A), k) A = sorted(A) comb_to_idx = { tuple(compute_combination_idx(A, len(A), k, i)): i for i in range(binomial_coefficient(len(A), k)) } return check_sequence_is_uniformly_random( [comb_to_idx[tuple(sorted(a))] for a in result], total_possible_outcomes, 0.01)
def compute_random_permutation_runner(executor, n): def permutation_index(perm): p = copy.deepcopy(perm) idx = 0 n = len(p) while p: a = p.pop(0) idx += a * math.factorial(n - 1) for i, b in enumerate(p): if b > a: p[i] -= 1 n -= 1 return idx result = executor.run( lambda: [compute_random_permutation(n) for _ in range(1000000)]) return check_sequence_is_uniformly_random( [permutation_index(perm) for perm in result], math.factorial(n), 0.01)
def uniform_random_runner(executor, lower_bound, upper_bound): result = executor.run(lambda : [uniform_random(lower_bound, upper_bound) for _ in range(100000)]) return check_sequence_is_uniformly_random( [a - lower_bound for a in result], upper_bound - lower_bound + 1, 0.01)
def uniform_random_runner(executor, lower_bound, upper_bound): result = executor.run(lambda : [uniform_random(lower_bound, upper_bound) for _ in range(100000)]) return check_sequence_is_uniformly_random( [a - lower_bound for a in result], upper_bound - lower_bound + 1, 0.01)