是否有任何可行的方法来创建唯一的随机整数。我知道如何使用唯一的数字制作数组或列表,但事实是我每次都需要不同的数字,因为我正在创建像考试这样的东西,而且我从db获取不同id-s的值。如果我重复考试,我会在考试时提出两个相同的问题。
如果没办法,你有什么建议?如何处理问题。我需要每次从db生成不同的id。 提前致谢。
答案 0 :(得分:1)
要从集合S创建一组N个唯一随机数,首先要创建一个大小为| S |的布尔数组(一组的基数,它包含多少元素)。现在,每次生成一个随机数时,检查数组以确保该数字的索引为false并将其设置为true,否则选择不同的数字。您生成的具有错误索引的每个随机数可以添加到另一个最终数字数组中。
答案 1 :(得分:1)
如果我可以重申您的问题,我认为您正在寻找“如何从 m 可用数字中随机选择 n 数字?”
换句话说,如果您有[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
作为可用数字并且想要选择4,则可能的结果是[8, 3, 5, 1]
。
有几种方法可以做到这一点。其中一个最简单的方法是将初始列表按随机顺序排列,然后取出顶部的 n 元素。
例如,在Python中:
>>> available = range(10)
>>> random.shuffle(available)
>>> available[:4]
[5, 8, 6, 9]
这个算法有点浪费,因为它会在您不需要的时候随机化整个列表。
改进将是,一次一个元素,将该元素与其后的随机位置交换。这被称为Fisher-Yates shuffle。在伪代码中看起来像这样:
-- To shuffle an array a of n elements (indices 0..n-1): for i from 0 to n−2 do j ← random integer such that i ≤ j < n exchange a[i] and a[j]
但是,不要遍历整个列表,只需深入 n ,其中 n 是您需要选择的项目数。
这是一个Python实现:
import random
def sample(items, how_many):
# copy the list
items = list(items)
# just do the first how_many items
for i in range(how_many):
random_index = random.randrange(i, len(items))
# swap the items
items[i], items[random_index] = items[random_index], items[i]
# return the first how_many
return items[:how_many]
print(sample(range(10), 4))
许多语言/库都有内置的方法来执行此操作。例如,在Python中,内置的random.sample
相当于我上面的代码:
>>> random.sample(range(10), 4)
[1, 5, 0, 4]
答案 2 :(得分:0)
在SQL中你可以试试这样的东西。下面的代码将为您提供从0到13的14个唯一编号,并将其存储在临时表中,您可以使用它做任何事情。在sql-server 2008中测试
declare @randNumbers table (number int)
declare @rand int, @howMany int
set @howMany = 14
set @rand = Ceiling(ABS(CHECKSUM(NewId())) % 25)
while ((select COUNT(*) from @randNumbers)<10)
begin
set @rand = Ceiling(ABS(CHECKSUM(NewId())) % @howMany)
BEGIN
IF NOT EXISTS (select * from @randNumbers
WHERE number = @rand)
BEGIN
insert into @randNumbers
values(@rand)
END
END
end
select * from @randNumbers
答案 3 :(得分:0)
您可以在数据库中创建序列并使用它来获取唯一的非重复自动递增数字...如果您需要随机数,请说出介于0000和9999之间的内容(仅作为示例),然后 1.创建一个生成此随机数的方法 2.使用数组将此已使用的数字或存储存储在db中 3.下次生成另一个号码时,请检查您是否已使用该号码。 4.在while循环中添加整个代码,直到您没有获得一个免费的数字,它将继续生成新的代码以进行检查。