【原神UGC】种子随机数套件-安装使用教程
简介
种子随机数套件包含4个复合节点:[种]权重随机、[种]随机浮点数、[种]随机整数、[种]int随机正整数。大部分情况可代替编辑器自带节点。使用前需设置关卡变量【种子状态】作为种子,您也可以直接修改变量重置序列。
属于线性同余生成器(LCG),并使用Schrage算法避免溢出。参数:a=16807, c=12345, m=2147483647
递推公式:X_{n+1} = (a * X_n + c) % m
!
使用提示
“种子”是用于生成“伪随机数”序列的一个起始值或输入值。设定相同的种子,就会产生完全相同的随机数序列。
如果你不需要类似可控的随机数序列,请直接使用编辑器自带节点。
安装
下载转存资产
访问奇域资产中心:https://act.mihoyo.com/ys/prod/ugc/component-store/index.html#/item/2010189944311517184 下载元件。
导入元件方法可参考:https://act.mihoyo.com/ys/ugc/tutorial/course/detail/mhgf8i0hvzag 中【3.导入资产】内容。
i
提示
当选择导入页签后,奇域内会出现多个起名导入页签的页签,可直接将它们修改成【种子随机数】页签,方便与其他资产做独立开来。
使用
1.设置关卡变量【种子状态】
在关卡变量中添加整数自定义变量【种子状态】。
!
警告
【种子状态】不能设置为0,否则会自动重置为随机数并打印警告日志。
2.使用种子随机数套件
直接使用复合节点即可,大部分情况可代替编辑器自带节点。
【[种]int随机正整数】 节点 实际生成范围为 [1, 2147483647) 随机整数,也就是说不能取到2147483647。
参考代码
参考Python代码
class SimpleLCG:
"""
线性同余生成器(LCG),并使用Schrage算法避免溢出
参数:a=16807, c=12345, m=2147483647
递推公式:X_{n+1} = (a * X_n + c) % m
"""
def __init__(self, seed: int = 1):
self.m = 2147483647 # 2^31-1
self.a = 16807
self.c = 12345
self.current = seed % self.m
# 预计算Schrage参数
self.schrage_q = self.m // self.a # 127773
self.schrage_r = self.m % self.a # 2836
print('__init__')
def next_int(self) -> int:
"""生成下一个随机整数 [0, m)"""
x = self.current
# Schrage算法分解
k = x // self.schrage_q
x_low = x % self.schrage_q
# 计算 a*x mod m
product = self.a * x_low - self.schrage_r * k
if product < 0:
product += self.m
# 加上常数c并取模
result = product + self.c
if result >= self.m:
result -= self.m
self.current = result
return result
def random(self) -> float:
"""生成 [0.0, 1.0) 范围内的随机浮点数"""
return self.next_int() / self.m
def randint(self, start: int, end: int) -> int:
"""生成 [start, end) 范围内的随机整数"""
if start >= end:
raise ValueError("start必须小于end")
return start + (self.next_int() % (end - start))
# 使用示例
if __name__ == "__main__":
# 创建生成器
lcg = SimpleLCG(seed=42)
# 生成随机数
print("随机整数序列:")
for i in range(5):
print(f"第{i + 1}个: {lcg.next_int():,}")
print("\n随机浮点数:")
lcg = SimpleLCG(seed=42) # 重置种子
for i in range(3):
print(f"{lcg.random():.6f}")
print("\n范围随机数 [10, 20):")
lcg = SimpleLCG(seed=42)
for i in range(5):
print(lcg.randint(10, 20))
本文含有AI生成的代码

浙公网安备 33010602011771号