如何从给定范围中随机选择唯一数字

时间:2017-02-12 01:20:35

标签: lua

我的目标是使用Lua计数到1000,然后随机删除一半的数字,然后将它们列出给我。 这是我到目前为止所拥有的。

i = 1
while i <= 1000 do
    print(i)
    i = i + 1
end
for i=1, 500, 1 do
    print(math.random(i))
end

这个问题是这个代码生成的随机数可以重复。我需要停止这种行为。

2 个答案:

答案 0 :(得分:0)

将它们全部放入一个数组并随机删除一半。

math.randomseed(os.time())
local nums = {}

for i = 1,1000 do
    num[i] = i
    print(i)
end
for i = 1,500 do
    print(table.remove(nums, math.random(#nums)))
end
nums = nil

答案 1 :(得分:0)

这样做的一种有效方法是首先从1 ​​- 1000初始化一个随机数字列表。为此,我们可以实现"inside out" Fisher-Yates样式的随机播放。

永远记得给你的PRNG播种!

math.randomseed(os.time())

local function random_numbers (from, to)
    local set = {}

    for index = from, to do
        local place = math.random(index)

        if place ~= index then
            set[index] = set[place]
        end

        set[place] = index
    end

    return set
end

local numbers = random_numbers(1, 1000)

打印它们的问题归结为仅查看数字的一半(或相当于一半的部分)。

for i = 1, 500 do
    print(numbers[i])
end

如果你真的想丢弃一半的数字,你应该迭代并清除列表的后半部分。这将确保列表保持密集。

for i = 501, 1000 do
    t[i] = nil
end