【原神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生成的代码

posted @ 2026-01-11 11:16  游佚  阅读(4)  评论(0)    收藏  举报