mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 07:38:48 +00:00
Add 128-bit random procedures to package math/rand
This commit is contained in:
@@ -47,8 +47,17 @@ uint64 :: proc(r: ^Rand = global_rand_ptr) -> u64 {
|
|||||||
return (a<<32) | b;
|
return (a<<32) | b;
|
||||||
}
|
}
|
||||||
|
|
||||||
int31 :: proc(r: ^Rand = global_rand_ptr) -> i32 { return i32(uint32(r) << 1 >> 1); }
|
uint128 :: proc(r: ^Rand = global_rand_ptr) -> u128 {
|
||||||
int63 :: proc(r: ^Rand = global_rand_ptr) -> i64 { return i64(uint64(r) << 1 >> 1); }
|
a := u128(_random(r));
|
||||||
|
b := u128(_random(r));
|
||||||
|
c := u128(_random(r));
|
||||||
|
d := u128(_random(r));
|
||||||
|
return (a<<96) | (b<<64) | (c<<32) | d;
|
||||||
|
}
|
||||||
|
|
||||||
|
int31 :: proc(r: ^Rand = global_rand_ptr) -> i32 { return i32(uint32(r) << 1 >> 1); }
|
||||||
|
int63 :: proc(r: ^Rand = global_rand_ptr) -> i64 { return i64(uint64(r) << 1 >> 1); }
|
||||||
|
int127 :: proc(r: ^Rand = global_rand_ptr) -> i128 { return i128(uint128(r) << 1 >> 1); }
|
||||||
|
|
||||||
int31_max :: proc(n: i32, r: ^Rand = global_rand_ptr) -> i32 {
|
int31_max :: proc(n: i32, r: ^Rand = global_rand_ptr) -> i32 {
|
||||||
if n <= 0 do panic("Invalid argument to int31_max");
|
if n <= 0 do panic("Invalid argument to int31_max");
|
||||||
@@ -76,6 +85,19 @@ int63_max :: proc(n: i64, r: ^Rand = global_rand_ptr) -> i64 {
|
|||||||
return v % n;
|
return v % n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int127_max :: proc(n: i128, r: ^Rand = global_rand_ptr) -> i128 {
|
||||||
|
if n <= 0 do panic("Invalid argument to int63_max");
|
||||||
|
if n&(n-1) == 0 {
|
||||||
|
return int127(r) & (n-1);
|
||||||
|
}
|
||||||
|
max := i128((1<<63) - 1 - (1<<63)&u128(n));
|
||||||
|
v := int127(r);
|
||||||
|
for v > max {
|
||||||
|
v = int127(r);
|
||||||
|
}
|
||||||
|
return v % n;
|
||||||
|
}
|
||||||
|
|
||||||
int_max :: proc(n: int, r: ^Rand = global_rand_ptr) -> int {
|
int_max :: proc(n: int, r: ^Rand = global_rand_ptr) -> int {
|
||||||
if n <= 0 do panic("Invalid argument to int_max");
|
if n <= 0 do panic("Invalid argument to int_max");
|
||||||
when size_of(int) == 4 {
|
when size_of(int) == 4 {
|
||||||
|
|||||||
Reference in New Issue
Block a user