As complexidades da aleatoriedade na computação (Ou como falhei em tentar aumentar a aleatoriedade) Escolhemos uma seed (Semente) inicial, esse valor pode ser obtido de vários maneiras, mas vamos definir ela manualmente. A semente será o X_0. 2 -> Aplicamos essa equação para calcular o x1: X_{1}=(AX_0+B) mod M 3 -> Agora vamos calcular o X2: X_{2}=(AX_1+B) mod M 4 -> Bom... Vamos calcular o X3: X_{3}=(AX_2+B) mod M 5 -> Acho que deu para entender o que vai acontecer aqui De maneira tosca, definimos uma seed X_0 ​ e aplicamos uma operação de multiplicação de A (um multiplicador) com X_0 ​ (a seed), somamos B (um incremento), e, em seguida, aplicamos a operação mod M (Encontrar o resto da divisão) para obter o próximo número aleatório X1, em seguida, esse número X1 será utilizado para gerar o próximo número, podemos dizer que ele é a nova seed. Isso pode parecer confuso, certo? Valores reais podem ajudar a entender melhor A = 5 B = 3 M = 16 X0 = 7 (seed) X1​ = (5×7+3) módulo 16 = 38 mod 16 = *6* //38 ÷ 16 = 2 e o resto é 6, 2 × 16 + 6 = 38 X1 = 6 X2 = (5×6+3) módulo 16 = 33 mod 16 = *1* X2 = 1 X3 = (5×1+3) módulo 16 = 8 mod 16 = *8* X3 = 8 --> 1[ ] | . |SensorLuminoso|-------- | [ ]A5/SCL [ ] [ ] [ ] RX<0[ ] | D0 |______________| | [ ] [ ] [ ] | | UNO_R3 GND MOSI 5V ____________/ \_______________________/ https://github.com/busyDuckman/ascii-art-arduinos/ O código do Arduino ficou extremamente simples, basicamente lê os valores dos 3 "sensores" cada 0.5 segundos e envia por serial: const int noisePin = A0; const int micPin = A2; const int ldrPin = A3; void setup() { Serial.begin(9600); delay(2000); } void loop() { int ldrValue = analogRead(ldrPin); Serial.println(ldrValue); delay(500); int micValue = analogRead(micPin); Serial.println(micValue); delay(500); int noiseValue = analogRead(noisePin); Serial.println(noiseValue); delay(500); } O Mersenne-Twister modificado ficou assim: import time import os import serial (w, n, m, r) = (32, 624, 397, 31) a = 0x9908B0DF (u, d) = (11, 0xFFFFFFFF) (s, b) = (7, 0x9D2C5680) (t, c) = (15, 0xEFC60000) l = 18 f = 1812433253 MT = [0 for _ in range(n)] index = n + 1 lower_mask = 0x7FFFFFFF upper_mask = 0x80000000 def mt_seed(seed): global index index = n MT[0] = seed for i in range(1, n): temp = f * (MT[i-1] ^ (MT[i-1] >> (w-2))) + i MT[i] = temp & 0xFFFFFFFF def extract_number(serial_port): global index if index >= n: twist() index = 0 noise_value = int(read_serial_data(serial_port)) ldr_value = int(read_serial_data(serial_port)) mic_value = int(read_serial_data(serial_port)) current_millis = current_time_millis() pid = get_pid() y = MT[index] ^ ldr_value ^ mic_value ^ noise_value ^ └►current_millis ^ pid #Eu confesso que isso foi extremamente mal feito =D y = y ^ ((y >> u) & d) y = y ^ ((y << s) & b) y = y ^ ((y << t) & c) y = y ^ (y >> l) index += 1 return y & 0xFFFFFFFF, ldr_value, mic_value, noise_value, └►pid, current_millis def twist(): for i in range(n): x = (MT[i] & upper_mask) + (MT[(i + 1) % n] & lower_mask) xA = x >> 1 if x % 2 != 0: xA = xA ^ a MT[i] = MT[(i + m) % n] ^ xA def current_time_millis(): return round(time.time() * 1000) def get_pid(): return os.getpid() def read_serial_data(serial_port): try: data = serial_port.readline().decode('latin-1').strip() return int(data) except ValueError: print("Error converting data to integer. Default value used.") return 0 def main(): serial_port = serial.Serial('COM5', 9600, timeout=1) time.sleep(2) while True: random_number, ldr_value, mic_value, noise_value, pid, └►current_millis = extract_number(serial_port) print(f"Random: {random_number} | LDR: {ldr_value} | └►Mic: {mic_value} | Noise: {noise_value} | PID: {pid} └►| Time: {current_millis}") time.sleep(1) if __name__ == '__main__': main() # Creditos: yinengy[13] --> --> -->