njin
Engine 2D gọn nhẹ để tự tay làm game theo ý mình. Vibe coding cũng ổn luôn
Toggle main menu visibility
Loading...
Searching...
No Matches
_random.h
1
#pragma once
2
#include "_math.h"
3
4
namespace
njin {
7
13
struct
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
34
u32
next_u32
() {
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
80
vec2
point_in
(
rect
r) {
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
njin::from_angle
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
njin::i64
std::int64_t i64
Số nguyên có dấu 64 bit.
Definition
_types.h:15
njin::i32
std::int32_t i32
Số nguyên có dấu 32 bit.
Definition
_types.h:14
njin::u64
std::uint64_t u64
Số nguyên không dấu 64 bit.
Definition
_types.h:23
njin::f32
float f32
Số thực 32 bit.
Definition
_types.h:28
njin::u32
std::uint32_t u32
Số nguyên không dấu 32 bit.
Definition
_types.h:22
njin::rect
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
njin::rect::pos
vec2 pos
Góc trên trái.
Definition
_math.h:14
njin::rect::size
vec2 size
Chiều rộng (x) và chiều cao (y).
Definition
_math.h:15
njin::rng::reseed
void reseed(u64 seed)
Đặt lại hạt giống.
Definition
_random.h:24
njin::rng::point_in
vec2 point_in(rect r)
Điểm ngẫu nhiên trong hình chữ nhật.
Definition
_random.h:80
njin::rng::unit
f32 unit()
Số thực trong [0, 1).
Definition
_random.h:44
njin::rng::direction
vec2 direction()
Vector độ dài 1 theo một hướng ngẫu nhiên.
Definition
_random.h:75
njin::rng::range
i32 range(i32 lo, i32 hi)
Số nguyên trong [lo, hi], gồm cả hi.
Definition
_random.h:56
njin::rng::rng
rng(u64 seed)
Tạo bộ sinh với hạt giống seed.
Definition
_random.h:20
njin::rng::chance
bool chance(f32 p)
Đúng với xác suất p.
Definition
_random.h:71
njin::rng::range
f32 range(f32 lo, f32 hi)
Số thực trong [lo, hi).
Definition
_random.h:50
njin::rng::state
u64 state
Trạng thái hiện tại.
Definition
_random.h:14
njin::rng::next_u32
u32 next_u32()
Số nguyên 32 bit tiếp theo.
Definition
_random.h:34
njin::rng::inc
u64 inc
Luồng (phải là số lẻ).
Definition
_random.h:15
njin::vec2
Vector 2 chiều. Dùng cho vị trí, kích thước, độ dời.
Definition
_types.h:39
njin::vec2::y
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
njin::vec2::x
f32 x
Thành phần ngang.
Definition
_types.h:40
_random.h
Được biên soạn bởi
1.18.0