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 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(timer, n, k): timer.start() result = [random_subset(n, k) for _ in range(100000)] timer.stop() 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[tuple(sorted(a))] for a in result], total_possible_outcomes, 0.01)
def online_random_sample_runner(timer, stream, k): timer.start() result = [online_random_sample(iter(stream), k) for _ in range(100000)] timer.stop() 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[tuple(sorted(a))] for a in result], total_possible_outcomes, 0.01)
def random_sampling_runner(timer, k, A): result = [] timer.start() for _ in range(100000): random_sampling(k, A) result.append(A[:k]) timer.stop() 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)