njin
Engine 2D gọn nhẹ để tự tay làm game theo ý mình. Vibe coding cũng ổn luôn
Loading...
Searching...
No Matches
_random.h
1#pragma once
2#include "_math.h"
3
4namespace njin {
7
13struct rng {
14 u64 state = 0x853c49e6748fea9bULL;
15 u64 inc = 0xda3e39cb94b95bdbULL;
16
17 rng() = default;
20 explicit rng(u64 seed) { reseed(seed); }
21
24 void reseed(u64 seed) {
25 state = 0;
26 inc = (seed << 1u) | 1u;
27 next_u32();
28 state += seed;
29 next_u32();
30 }
31
35 const u64 old = state;
36 state = old * 6364136223846793005ULL + inc;
37 const u32 xorshifted = (u32)(((old >> 18u) ^ old) >> 27u);
38 const u32 rot = (u32)(old >> 59u);
39 return (xorshifted >> rot) | (xorshifted << ((-rot) & 31u));
40 }
41
44 f32 unit() { return (f32)(next_u32() >> 8) * (1.0f / 16777216.0f); }
45
50 f32 range(f32 lo, f32 hi) { return lo + (hi - lo) * unit(); }
51
56 i32 range(i32 lo, i32 hi) {
57 if (hi <= lo)
58 return lo;
59 const u32 span = (u32)((i64)hi - (i64)lo + 1);
60 // Loại bỏ phần dư để mọi số có xác suất như nhau.
61 const u32 limit = (u32)(-span) % span;
62 u32 r = next_u32();
63 while (r < limit)
64 r = next_u32();
65 return (i32)((i64)lo + (i64)(r % span));
66 }
67
71 bool chance(f32 p) { return unit() < p; }
72
75 vec2 direction() { return from_angle(range(0.0f, 360.0f)); }
76
81 return {r.pos.x + range(0.0f, r.size.x), r.pos.y + range(0.0f, r.size.y)};
82 }
83};
84
85} // namespace njin
vec2 from_angle(f32 degrees)
Vector độ dài 1 theo một góc, 0 độ là hướng sang phải, tăng theo chiều kim đồng hồ trên màn hình.
Definition _math.h:94
std::int64_t i64
Số nguyên có dấu 64 bit.
Definition _types.h:15
std::int32_t i32
Số nguyên có dấu 32 bit.
Definition _types.h:14
std::uint64_t u64
Số nguyên không dấu 64 bit.
Definition _types.h:23
float f32
Số thực 32 bit.
Definition _types.h:28
std::uint32_t u32
Số nguyên không dấu 32 bit.
Definition _types.h:22
Hình chữ nhật thẳng trục: pos là góc trên trái, size là rộng và cao.
Definition _math.h:13
vec2 pos
Góc trên trái.
Definition _math.h:14
vec2 size
Chiều rộng (x) và chiều cao (y).
Definition _math.h:15
void reseed(u64 seed)
Đặt lại hạt giống.
Definition _random.h:24
vec2 point_in(rect r)
Điểm ngẫu nhiên trong hình chữ nhật.
Definition _random.h:80
f32 unit()
Số thực trong [0, 1).
Definition _random.h:44
vec2 direction()
Vector độ dài 1 theo một hướng ngẫu nhiên.
Definition _random.h:75
i32 range(i32 lo, i32 hi)
Số nguyên trong [lo, hi], gồm cả hi.
Definition _random.h:56
rng(u64 seed)
Tạo bộ sinh với hạt giống seed.
Definition _random.h:20
bool chance(f32 p)
Đúng với xác suất p.
Definition _random.h:71
f32 range(f32 lo, f32 hi)
Số thực trong [lo, hi).
Definition _random.h:50
u64 state
Trạng thái hiện tại.
Definition _random.h:14
u32 next_u32()
Số nguyên 32 bit tiếp theo.
Definition _random.h:34
u64 inc
Luồng (phải là số lẻ).
Definition _random.h:15
Vector 2 chiều. Dùng cho vị trí, kích thước, độ dời.
Definition _types.h:39
f32 y
Thành phần dọc (trong không gian màn hình, y tăng khi đi xuống).
Definition _types.h:41
f32 x
Thành phần ngang.
Definition _types.h:40