3

所以我在 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() 这样的东西)

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

4

3 回答 3

3

像那么简单就好了。作为语言一部分的大多数随机数生成器都是线性同余生成器,这意味着下一项J与前一项I相关

J = (aI + b) mod c

其中a, b,c是常数。

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

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

于 2013-10-26T22:46:06.863 回答
2

我相信欢迎您使用内置的随机数生成器来获取随机数,但禁止使用任何可能存在的内置数组混洗器。您如何使用 rng 让每张卡在每个位置上的可能性相同?

于 2013-10-27T13:35:18.033 回答
0

你可以写一些随机抽取一张牌并将其放入洗好的牌组的东西:

function shuf(tab)
    local new = {}
    for k=1,#tab do
        new[#new+1]=table.remove(tab,math.random(#tab))
    end
end

这种方法可确保您没有双打。

我真的不认为使用不同的 RNG 会那么重要,除非你正在做密码学,或者其他真正重要的事情。

解释这个问题:只是不要使用为此编写的库函数。但是洗牌器和随机数生成器之间是有区别的,因为后者可以返回双精度值,而前者不能。

于 2013-10-30T12:20:52.067 回答