commit d4232e0a587d17419943be17e7f3226d02741618 Author: 諏訪子 Date: Tue Jan 6 20:58:13 2026 +0900 SVNからのミラー diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..0598d6b --- /dev/null +++ b/Makefile @@ -0,0 +1,4 @@ +all: + cc -o rng main.c -static -lc + +.PHONY: all diff --git a/main.c b/main.c new file mode 100644 index 0000000..e4b2d31 --- /dev/null +++ b/main.c @@ -0,0 +1,120 @@ +#include + +static uint32_t x = 123456789, y = 362436069, z = 521288629, w = 88675123; + +static uint32_t xorshift128(void) { + uint32_t t = x; + t ^= t << 11; + t ^= t >> 8; + x = y; y = z; z = w; + w ^= w >> 19; + w ^= t; + return w; +} + +uint32_t prand(void) { + return xorshift128(); +} + +void psrand(uint32_t seed) { + if (seed == 0) seed = 1; + + x = seed; + y = seed ^ 0xDEADBEEF; + z = seed ^ 0xCAFEBABE; + w = seed ^ 0xF00DCAFE; + + for (int i = 0; i < 10; i++) xorshift128(); +} + +uint32_t genseed(void) { + uint32_t seed = 0; + seed ^= (uint32_t)(uintptr_t)&seed; + + uint32_t uninit_var; + seed ^= uninit_var; + + volatile uint32_t counter = 0; + for (int i = 0; i < 1000; i++) counter += i; + + seed ^= counter; + seed ^= (uint32_t)__LINE__ ^ (uint32_t)(uintptr_t)__FILE__; + + x = seed; + y = seed ^ 0xDEADBEEF; + z = seed ^ 0xCAFEBABE; + w = seed ^ 0xF00DCAFE; + seed = xorshift128(); + + if (seed == 0) seed = 1; + return seed; +} + +void uint_to_string(uint32_t num, char *buf, int *len) { + char tmp[11]; + int i = 0; + if (num == 0) { + buf[0] = '0'; + buf[1] = '\0'; + *len = 1; + return; + } + + while (num > 0) { + tmp[i++] = (num % 10) + '0'; + num /= 10; + } + + *len = i; + for (int j = 0; j < i; j++) buf[j] = tmp[i - 1 - j]; + + buf[i] = '\0'; +} + +static inline long syscall(long arg1, long arg2, long arg3) { +#if defined(__linux__) + long num = 1; + long ret; + register long rdi asm("rdi") = arg1; // ファイルディスクリプタ + register long rsi asm("rsi") = arg2; // バッファー + register long rdx asm("rdx") = arg3; // 長さ + register long rax asm("rax") = num; // システムコール:書き込み + __asm__ volatile ("syscall" + : "=a"(ret) + : "r"(num), "r"(arg1), "r"(arg2), "r"(arg3) + : "rdi", "rsi", "rdx", "rcx", "r11", "memory"); + + return ret; +#elif defined(__FreeBSD__) + long num = 4; + long ret; + __asm__ volatile ( + "mov %1, %%rax\n" + "mov %2, %%rdi\n" + "mov %3, %%rsi\n" + "mov %4, %%rdx\n" + "syscall\n" + : "=a"(ret) + : "r"(num), "r"(arg1), "r"(arg2), "r"(arg3) + : "rdi", "rsi", "rdx", "rcx", "r8", "r9", "r10", "r11", "memory", "cc" + ); + return ret; +#else + return 0; +#endif +} + +int main(void) { + psrand(genseed()); + + char buf[32]; + int blen; + int min = 0x01, max = 0xFF; + int random = min + (prand() % (max - min + 1)); + + uint_to_string(random, buf, &blen); + syscall(1, (long)buf, blen); + syscall(1, (long)"\n", 1); + + return 0; +}