xwjcool
本帖最后由 xwjcool 于 2022-7-5 19:50 编辑

基本信息



介绍:
这是一个基于线性同余生成器的伪随机数发生器,用于生成伪随机数序列。

优点
  • 高效——生成一个32位的整型伪随机数只需要11条命令,不包含任何递归与循环,也不需要生成任何marker实体——12条命令的纯计算,这比以往逐位生成的随机数模块都要快。不用担心,它看起来就和真正的随机数一样。
  • 大范围——它的输出范围覆盖了-2147483648~2147483647的所有整数,是以往随机数模块的两倍。
  • 基本可靠——在三维空间未观测到明显的分布平面。这是一个48位的生成器,输出高32位,避免了最低位01交替出现的问题。
  • 实用——每个玩家都拥有自己的随机实例。只要两个玩家的种子相同,他们就能生成同样的随机序列。不用去记录整个序列,也不用担心搞丢。
  • 跨版本兼容——从1.13到快照,全部都能用。


缺点
  • 不够安全——可以被暴力破解。不过如果仅仅用于游戏的话是不用担心这些的。
  • 有周期——周期为2^48,之后就会开始重复。不过能用到整个周期的情况几乎不存在。


它是“伪”随机。我可以放心使用它吗?
如果用于游戏解密地图,为游戏添加随机元素——可以的。这个数据包生成的数对于不知道其背后机理与内部状态的玩家而言看起来是“随机”而“无规律”的(如果不知道原理、不借助工具,就算在屏幕前盯上一整天也找不到规律的)。而且,比起其他基于命令的随机实现方法,它更可控一些。
然而:如果你希望将其用于难以被人破解的用途,如密码学,那么我的建议是——最好不要使用。这个生成器不够安全。可能花个几小时甚至几分钟,一些技术人员就可以暴力破解它。



使用方法:

安装
下载本数据包并将其放在存档目录的datapacks文件夹下。
Not That Random 1.0.2.zip (6.44 KB, 下载次数: 140)
在游戏中执行/reload



初始化随机实例
本数据包允许每一个实体都拥有一个独立的随机实例。同时,还拥有一个全局实例。这些实例可以相同,也可以不同。
第一次使用前请务必初始化
  1. #获得一个新的种子并初始化自己的随机实例
  2. function lcg:randomize

  3. #获得一个新的种子并初始化全局随机实例
  4. function lcg:global_randomize

  5. #初始化自己的随机实例,但不更新种子(使用自定义种子时请使用这个)
  6. function lcg:reset

  7. #初始化全局随机实例,但不更新种子(使用自定义种子时请使用这个)
  8. function lcg:global_reset
复制代码

本生成器采用48位的种子与内部状态。种子保存在实体或 _global 的 lcg_seed_hi32 (高32位,范围-2147483648~2147483647)与 lcg_seed_lo16 (低16位,范围0~65535)这两个计分板目标下。

输出伪随机数
  1. #更新自身实例的状态并输出一个伪随机数
  2. function lcg:rand

  3. #更新全局实例的状态并输出一个伪随机数
  4. function lcg:global_rand
复制代码

输出的伪随机数范围在-2147483648~2147483647,覆盖了整个记分板的范围。输出的结果存储在实体或 _global 的 lcg_output 记分板目标下

获取与设置种子

每个实例拥有自己的种子。使用randomize进行初始化时会自动获取一个种子。你也可以指定你想要的种子,然后进行reset
  1. #获取自己的种子
  2. function lcg:getseed

  3. #获取全局实例的种子
  4. function lcg:global_getseed

  5. #设置自己的种子(例)
  6. scoreboard players set @s lcg_seed_hi32 123456789
  7. scoreboard players set @s lcg_seed_lo16 12345

  8. #设置全局实例的种子(例)
  9. scoreboard players set _global lcg_seed_hi32 123456789
  10. scoreboard players set _global lcg_seed_lo16 12345
复制代码



应用:


许可协议:
本数据包基于Sam Hocevar的WTFPL2分发。详见:https://wtfpl2.com/


2021.12 数据,可能有更多内容
基本信息



介绍:
这是一个基于线性同余生成器的伪随机数发生器,用于生成伪随机数序列。


优点
  • 高效——生成一个32位的整型伪随机数只需要11条命令,不包含任何递归与循环,也不需要生成任何marker实体——12条命令的纯计算,这比以往逐位生成的随机数模块都要快。不用担心,它看起来就和真正的随机数一样。
  • 大范围——它的输出范围覆盖了-2147483648~2147483647的所有整数,是以往随机数模块的两倍。
  • 基本可靠——在三维空间未观测到明显的分布平面。这是一个48位的生成器,输出高32位,避免了最低位01交替出现的问题。
  • 实用——每个玩家都拥有自己的随机实例。只要两个玩家的种子相同,他们就能生成同样的随机序列。不用去记录整个序列,也不用担心搞丢。
  • 跨版本兼容——从1.13到快照,全部都能用。



缺点
  • 不够安全——可以被暴力破解。不过如果仅仅用于游戏的话是不用担心这些的。
  • 有周期——周期为2^48,之后就会开始重复。不过能用到整个周期的情况几乎不存在。



它是“伪”随机。我可以放心使用它吗?
如果用于游戏解密地图,为游戏添加随机元素——可以的。这个数据包生成的数对于不知道其背后机理与内部状态的玩家而言看起来是“随机”而“无规律”的(如果不知道原理、不借助工具,就算在屏幕前盯上一整天也找不到规律的)。而且,比起其他基于命令的随机实现方法,它更可控一些。
然而:如果你希望将其用于难以被人破解的用途,如密码学,那么我的建议是——最好不要使用。这个生成器不够安全。可能花个几小时甚至几分钟,一些技术人员就可以暴力破解它。




使用方法:


安装
下载本数据包并将其放在存档目录的datapacks文件夹下。

在游戏中执行/reload


初始化随机实例
本数据包允许每一个实体都拥有一个独立的随机实例。同时,还拥有一个全局实例。这些实例可以相同,也可以不同。
第一次使用前请务必初始化

代码:

  1. #获得一个新的种子并初始化自己的随机实例
  2. function lcg:randomize

  3. #获得一个新的种子并初始化全局随机实例
  4. function lcg:global_randomize

  5. #初始化自己的随机实例,但不更新种子(使用自定义种子时请使用这个)
  6. function lcg:reset

  7. #初始化全局随机实例,但不更新种子(使用自定义种子时请使用这个)
  8. function lcg:global_reset

本生成器采用48位的种子与内部状态。种子保存在实体或 _global 的 lcg_seed_hi32 (高32位,范围-2147483648~2147483647)与 lcg_seed_lo16 (低16位,范围0~65535)这两个计分板目标下。


输出伪随机数

代码:

  1. #更新自身实例的状态并输出一个伪随机数
  2. function lcg:rand

  3. #更新全局实例的状态并输出一个伪随机数
  4. function lcg:global_rand

输出的伪随机数范围在-2147483648~2147483647,覆盖了整个记分板的范围。输出的结果存储在实体或 _global 的 lcg_output 记分板目标下


获取与设置种子


每个实例拥有自己的种子。使用randomize进行初始化时会自动获取一个种子。你也可以指定你想要的种子,然后进行reset

代码:

  1. #获取自己的种子
  2. function lcg:getseed

  3. #获取全局实例的种子
  4. function lcg:global_getseed

  5. #设置自己的种子(例)
  6. scoreboard players set @s lcg_seed_hi32 123456789
  7. scoreboard players set @s lcg_seed_lo16 12345

  8. #设置全局实例的种子(例)
  9. scoreboard players set _global lcg_seed_hi32 123456789
  10. scoreboard players set _global lcg_seed_lo16 12345



应用:
  • 在调试过程(如测试发牌、测试功能)的过程中,反复输出同一“随机”序列。
  • 在类似俄罗斯方块的多人对抗中,需要保证各个选手虽然步调不一致,但是获得的随机序列是相同的
  • Replay功能回放随机事件
  • 在类似“扫雷”的游戏中重新开始同一版面
  • 也可以当作普通的随机来用




原理:
这个生成器的核心是一个标准的线性同余生成器。

代码:

  1. state = (state * 25214903917 + 11) mod (2 ^ 48)
因为生成器只有48位,所以高于48位的部分将会溢出而被直接舍弃,相当于直接对2^48取余。


准备工作
这里是定义常量和变量的部分。这部分在#minecraft:load里执行。

代码:

  1. scoreboard objectives add lcg_timestamp dummy
  2. scoreboard objectives add lcg_seed_hi32 dummy
  3. scoreboard objectives add lcg_seed_lo16 dummy
  4. scoreboard objectives add lcg_state_hi32 dummy
  5. scoreboard objectives add lcg_state_lo16 dummy
  6. scoreboard objectives add lcg_output dummy

  7. scoreboard objectives add data_version dummy

  8. # LCG parameters (基本参数的定义)
  9. scoreboard objectives add lcg_multi_lo16 dummy
  10. scoreboard objectives add lcg_multi_lo32 dummy
  11. scoreboard objectives add lcg_multi_hi32 dummy
  12. scoreboard objectives add lcg_increment dummy
  13. scoreboard objectives add lcg_carry dummy
  14. scoreboard objectives add lcg_1s dummy

  15. # 0x5DEECE66D (这个数超过32-bit int上限,所以拆成段以方便计算)
  16. scoreboard players set _global lcg_multi_hi32 384748
  17. scoreboard players set _global lcg_multi_lo16 58989
  18. scoreboard players set _global lcg_multi_lo32 -554899859

  19. # 0xB
  20. scoreboard players set _global lcg_increment 11

  21. # 0x1000
  22. scoreboard players set _global lcg_1s 65536

获得种子
生成一个药水云实体并根据它的UUID获取种子。根据版本的不同,这个数据包会使用不同的命令。这里展示的是20w12a及以后会执行的命令。

代码:

  1. #get seed and set initial state from random entity UUID
  2. execute at @s run summon area_effect_cloud ~ ~ ~ {Tags:[lcg_randomizer]}
  3. execute store result score @s lcg_seed_hi32 run data get entity @e[tag=lcg_randomizer,limit=1] UUID[1]
  4. execute store result score @s lcg_seed_lo16 run data get entity @e[tag=lcg_randomizer,limit=1] UUID[3]
  5. scoreboard players operation @s lcg_seed_lo16 %= _global lcg_1s
  6. kill @e[tag=lcg_randomizer]

初始化

代码:

  1. #将当前状态设为种子
  2. scoreboard players operation @s lcg_state_hi32 = @s lcg_seed_hi32
  3. scoreboard players operation @s lcg_state_lo16 = @s lcg_seed_lo16

刷新状态并输出随机数
这是本生成器的核心部分。更新一次状态并生成新的随机数。输出的随机数为更新后的状态的高32位。

代码:

  1. # refresh the state
  2. # state = (state * 25214903917 + 11) mod (2 ^ 48)
  3. scoreboard players operation @s lcg_carry = @s lcg_state_lo16
  4. scoreboard players operation @s lcg_state_lo16 *= _global lcg_multi_lo16
  5. scoreboard players operation @s lcg_carry *= _global lcg_multi_hi32
  6. scoreboard players operation @s lcg_state_hi32 *= _global lcg_multi_lo32
  7. scoreboard players operation @s lcg_state_hi32 += @s lcg_carry

  8. scoreboard players add @s lcg_state_lo16 11
  9. execute if score @s lcg_seed_lo16 matches 0..10 run scoreboard players add @s lcg_state_hi32 1
  10. scoreboard players operation @s lcg_carry = @s lcg_state_lo16
  11. scoreboard players operation @s lcg_carry /= _global lcg_1s
  12. scoreboard players operation @s lcg_carry %= _global lcg_1s
  13. scoreboard players operation @s lcg_state_hi32 += @s lcg_carry
  14. scoreboard players operation @s lcg_state_lo16 %= _global lcg_1s

  15. # output (for further modification or ready to use)
  16. scoreboard players operation @s lcg_output = @s lcg_state_hi32



+ 2021.05.07 修复一个可能会导致错误进位的问题。

空辰KC
not that random 牛头人狂喜,纯爱党正在赶来的路上

可以加点靠随机而经常用的功能(做成前置(划去)
所以随机数真是个生草的东西(悲)

3491638801
1dasdasdad

晴路卡
放张随机生成的猫



玄素
这个名字有点过头了
不 要 起 擦 边 球 鬼 名 字

Never-Mind
牛头人狂喜,纯爱党正在赶来的路上,猎牛人

brooke_zb
现在原版模组起名都这么生草的吗?马大哈,牛头人,WTMSB,这都啥名字啊(战术后仰
不过随机数这样很常用的还是挺实用的

望帝啼鹊
牛头人是真的强

lifuhao
666666666666

小白小孟
滴强!滴强!滴强!

小白小孟
滴强!滴强!滴强

qq1244696403
谢谢楼主的分享.

xiaoshuguang
有点意思 支持一下楼主

晴路卡
(=°ω°)丿 发表于 2020-6-6 16:45
理想气体状态方程:PV=nTR,
而分子的热运动是随机的,
所以,我编不下去了(

断言 LT UUID都好
过往整随机的东西都太不可控了

线性同余的优势在帖子的第二条应用里已经很明显了

VOLRIS
这个是真的强

VCS-Official
现在的取名都这么讲究的嘛,i了i了
→一直不知道牛头人是啥的屑

WYL0zhu
你不是可以吧初始化的内容添加到函数标签#minecraft:load里吗,这样就可以让使用者不用手动初始化了。

xwjcool
本帖最后由 xwjcool123 于 2020-6-15 15:52 编辑
WYL0zhu 发表于 2020-6-14 13:51
你不是可以吧初始化的内容添加到函数标签#minecraft:load里吗,这样就可以让使用者不用手动初始化了。 ...

本来刚开始是这么搞的,后来考虑到实际使用的时候可以设置种子再初始化,所以移除了。而且每个玩家拥有自己的随机实例,多人游戏如果在#load初始化的话,不能保证玩家都同时在线
而且直接使用这个数据包的通常不是普通玩家,一般都是其他数据包的作者什么的。手动初始化也方便debug

2430162630
羊驼大战ntr?

吾之凯旋
太草了

kayn-
纯爱战士一拳一个牛头人,取这个标题233

堕天使之墓
神TM牛头人,不怕被打死吗
这玩意......
单个命令能看懂但放一起就不知道是什么鬼了
一堆运算弄可控随机,em

Lingqian
MCBBS有你更精彩~

18226085696
nice~~~~~~~~~~~~~~~~

忘记了,爱
十分实用L)))

NRBL
好的 很强 就是这个名字牛头人。。。

永爱不忘
NTR生成器  现在连这都有了吗

第一页 上一页 下一页 最后一页