Random 我需要生成一个32位随机数使用lua,请建议一些方法

Random 我需要生成一个32位随机数使用lua,请建议一些方法,random,lua,unique,Random,Lua,Unique,我想生成一个包含字母数字字符的32位键,它们应该总是唯一的。请建议一种方法 我用过math.random函数,但我一次又一次地得到相同的随机数,我希望它是唯一的。如果你想要一个唯一的数,你必须有一个用过的数的列表。否则,您将始终有机会再次获得旧号码。虽然它不太可能是32位数字 您显然没有阅读有关math.random的文档: 否则,您将知道math.random将始终提供相同的伪随机数,除非您使用math.randomseed更改种子值 在使用函数之前,请务必阅读有关函数的文档。下面这个简单的

我想生成一个包含字母数字字符的32位键,它们应该总是唯一的。请建议一种方法


我用过math.random函数,但我一次又一次地得到相同的随机数,我希望它是唯一的。

如果你想要一个唯一的数,你必须有一个用过的数的列表。否则,您将始终有机会再次获得旧号码。虽然它不太可能是32位数字

您显然没有阅读有关
math.random
的文档:

否则,您将知道
math.random
将始终提供相同的伪随机数,除非您使用
math.randomseed
更改种子值


在使用函数之前,请务必阅读有关函数的文档。

下面这个简单的程序可以生成1000个随机的32位键,无需重复,也不会浪费精力:

M=2^32-1
R={}
N=1000
n=0

for i=1,N do
    local x=math.random(M)
    if R[x]==nil then n=n+1 R[x]=n print(n,i,n==i,x) end
end

关键是
M
太大了,即使我们将
N
增加到一百万,重复的可能性也很小。

您可以使用math.random进行此操作,但您可能需要设置种子,可能需要使用os.time。但是请注意,底层引擎很可能不适合安全应用程序。考虑生成字母数字键的方式:您尝试了什么。请给我们看看。你说的独特是什么意思?和什么相比?32位键的数量是有限的,所以它们不可能总是唯一的。从sqrt(M)开始,重复的可能性很大。因此,对于N=10,重复极有可能至少发生一次^6@EgorSkriptunoff,我在顶部添加了
math.randomseed(os.time())
,并使用
N=1e6
运行了几次。没有一次重复。。。当然,这可能说明了一些关于底层随机生成器的事情……依我看,这是不可能的。零重复的概率约为
exp(-0.5*N*N/M)
。PRNG的不良统计特性应该会进一步增加重复频率。@EgorSkriptunoff,它在Lua5.2(使用
rand
)中工作,但在5.3(使用POSIX
random
)中不起作用……将
打印(N,N==N)
添加到程序末尾以查看实际结果;-)在第一次重复之后,所有生成数字的尝试都是重复,这就是为什么您看不到
false
打印。