algorithm - 我什么时候应该编写自己的随机数算法而不是使用常用的数学函数?

标签 algorithm random lua

所以我在 Lua 中进行脚本测试,我得到了这个问题:

  1. 创建一个算法来生成一副纸牌,1-52。洗牌(不要使用类似 array.randomize() 的东西)。然后将 5 张卡片分发给两个不同的玩家。因为每张牌必须一次发给不同的玩家。

通常我会做这样的事情来获得一个随机数

local newDeck = {} --assume this array has all 52 cards in a playing deck
math.randomseed( os.time() )
local card = math.random(#newDeck)

...但问题似乎是专门要求我不使用常用数学函数。

(不要使用像 array.randomize() 这样的东西)

这样做有什么好处?我无法想象这样一款游戏的玩家甚至会注意到随机和伪随机之间的区别。

最佳答案

要是这么简单就好了。语言中的大多数随机数生成器都是线性同余生成器,这意味着下一项 J ,比如说,与前一个有关I通过

J = (aI + b) mod c

在哪里a , b , c是常数。

这意味着可以从单个数字的项中破译序列!(这是一组联立方程,在处理模数时有些技巧)。

我想说的是,精明的玩家必然会注意到您的序列的伪随机性质,甚至可能通过取消选择您的生成器来游戏系统。您需要使用更复杂的方案。 (早期尝试包括 Park-Miller 和 Bays-Durham;相当知名的方法)。

关于algorithm - 我什么时候应该编写自己的随机数算法而不是使用常用的数学函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19612653/

相关文章:

C++ boost 随机数生成器为多个实例设置种子

python - 无法执行lua代码,从文件读取

LuaJIT,如何将cdata转换为userdata?

java - 如果启动了较新的实例,则终止程序的较旧实例

algorithm - 图中最长路径

javascript - JavaScript 中的贪心算法

for-loop - for-do 循环结束后获取表值

php - 回溯迷宫生成(将所有内容转换为二维数组)

javascript - 在 JavaScript 中生成随机字符串/字符

c++ - 如何生成一个随机的、不重复的字符串 C++