-
-
Save odudex/37b3366e7171b27fda315ae47096a36b to your computer and use it in GitHub Desktop.
import random | |
def pattern_detection(rolls, num_sides): | |
"""Calculate Shannon's entropy of roll derivatives to detect arithmetic progression patterns. | |
Args: | |
rolls (list of int): List of dice rolls. | |
num_sides (int): Number of sides on the dice. | |
Returns: | |
int: A percentage representing how much the sequence deviates from maximum entropy (0% is random, 100% is non-random). | |
""" | |
import math | |
if len(rolls) < 2: | |
return 0 # Not enough data to analyze | |
# Calculate derivatives | |
derivatives = [int(rolls[i]) - int(rolls[i - 1]) for i in range(1, len(rolls))] | |
min_derivative, max_derivative = -num_sides + 1, num_sides - 1 | |
derivative_range = max_derivative - min_derivative + 1 | |
derivative_counts = [0] * derivative_range | |
# Count each derivative | |
for derivative in derivatives: | |
index = derivative - min_derivative | |
derivative_counts[index] += 1 | |
# Calculate entropy | |
total_derivatives = len(derivatives) | |
derivative_entropy = sum(-p / total_derivatives * math.log2(p / total_derivatives) for p in derivative_counts if p > 0) | |
# Normalize entropy | |
max_entropy = math.log2(derivative_range) | |
normalized_entropy = (max_entropy - derivative_entropy) / max_entropy * 100 | |
return int(normalized_entropy) | |
# Test | |
d6_pattern_rolls = [ | |
"12345612345612345612345612345612345612345612345612", | |
"11111111122222222333333334444444455555555566666666", | |
"12345665432112345665432112345665432112345665432112", | |
"24624624624624624624624624624624624624624624624624", | |
"36363636363636363636363636363636363636363636363636", | |
"12121212121212121212121212121212121212121212121212", | |
"65432165432165432165432165432165432165432165432165", | |
"12365412365412365412365412365412365412365412365412", | |
"12654312654312654312654312654312654312654312654312", | |
"24612345612345612345612345612345612345612345612345", | |
"32165432165432165432165432165432165432165432165432", | |
"65432165432165432165432165432165432165432165432165", | |
"63524163524163524163524163524163524163524163524163", | |
"36251436251436251436251436251436251436251436251436", | |
"14253614253614253614253614253614253614253614253614", | |
"41526341526341526341526341526341526341526341526341", | |
] | |
for rolls in d6_pattern_rolls: | |
print(rolls+":", str(pattern_detection(([int(digit) for digit in rolls]), 6))+"%") | |
print("\n") | |
for _ in range(5): | |
rolls_d6_random = [random.randint(1, 6) for _ in range(50)] | |
str_list = map(str, rolls_d6_random) # Convert each integer to a string | |
joined_string = ''.join(str_list) | |
print(joined_string + ":", str(pattern_detection(rolls_d6_random, 6)) + "%") | |
print("\n") | |
rolls_d20_set = "1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17-18-19-20-1-2-3-4-5-6-7-8-9-10" | |
print("D20 pattern rolls:", str(pattern_detection(rolls_d20_set.split("-"), 20)) + "%") | |
print("\n") | |
for _ in range(5): | |
rolls_d20_random = [random.randint(1, 20) for _ in range(30)] | |
print("D20 random rolls:", str(pattern_detection(rolls_d20_random, 20)) + "%") |
12365412365412365412365412365412365412365412365412: 44%
12654312654312654312654312654312654312654312654312: 47%
24612345612345612345612345612345612345612345612345: 74%
32165432165432165432165432165432165432165432165432: 81%
65432165432165432165432165432165432165432165432165: 81%
63524163524163524163524163524163524163524163524163: 58%
36251436251436251436251436251436251436251436251436: 58%
14253614253614253614253614253614253614253614253614: 58%
41526341526341526341526341526341526341526341526341: 58%
Some random rolls:
32666462354354141511214112235332256413344652315424: 12%
23535431656516232345151521545414161262333461354665: 8%
26451155524611165353641533456321125431212652425425: 8%
64221464123546211161332315241212243442122462232646: 11%
64132164126224666315561656651663163464652316353311: 9%
Attempting to roll fingers in different patterns on the number pad, tried these d6_pattern_rolls: