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

我想用 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

这段代码生成的随机数可能会重复出现,我希望这种情况能够停止。

点赞
用户3979429
用户3979429

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

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
2017-02-12 03:24:41
用户2505965
用户2505965

一种效率较高的方法是通过初始化一个从1到1000的随机数列表来开始。为了做到这一点,我们可以实现一个"内部化" 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
2017-02-12 06:07:03