我想在某个diapason中生成随机数,我必须确定,每个新数字都不是前者的副本.一种解决方案是将以前生成的数字存储在容器中,并且每个新数字都检查容器.如果容器中有这样的数字,那么我们生成agin,否则我们使用并将其添加到容器中.但是对于每个新的数字,这个操作变得越来越慢.有没有更好的方法,或任何可以更快地工作并确保代的唯一性的兰特函数?
编辑:是的,有一个限制(例如从0到1.000.000.000).但我想生成100.000个唯一数字!(如果解决方案是使用Qt功能,将会很棒.)
写一个函数有:
input: array of pairs (unique id and weight) length of N, K =< N
output: K random unique ids (from input array)
Run Code Online (Sandbox Code Playgroud)
注意:在输出中多次出现某些Id的频率被调用的次数应该越多,它的权重就越大.示例:权重为5的id应出现在输出中比id为1的频率多5倍.此外,分配的内存量应在编译时知道,即不应分配额外的内存.
我的问题是:如何解决这个问题?
编辑
感谢大家的回复!
目前我无法理解对的重量如何影响输出对的出现频率,你能给我更清楚,"虚拟"解释它是如何工作的吗?
很抱歉打扰你我知道这个问题已经被问了很多但是从来没有跟Ada ...我想知道Ada标准库中是否有一种方法可以生成一个独特的随机数列表(你永远不会选择两次) O(n)中的相同数字在某种程度上,Ada中是否存在Knuth-Fisher-Yates算法的实现?
我想创建一个不重复它已经发出的数字的数字生成器(C++).
我所知道的是:
int randomgenerator(){
int random;
srand(time(0));
random = rand()%11;
return(random);
} // Added this on edition
Run Code Online (Sandbox Code Playgroud)
那个功能给了我多余的数字.
我正在尝试创建一个问卷程序,以随机顺序发出10个问题,我不希望任何问题重新出现.
有谁知道语法?
从0到20生成5个随机非重复整数的最佳方法是什么?
我在想,使用Math.random和floor,循环5次,检查重复,如果重复,再次随机.
你的方式是什么?
我遇到了一个挑战,我需要一个在给定范围内返回随机数的函数0 - X.不仅如此,我还要求返回的数字是唯一的 ; 不复制先前调用该函数时已返回的数字.
可选地,当完成此操作时(例如,范围已经"耗尽"),只需返回范围内的随机数.
怎么会这样做呢?
我有std::vector一些不确定大小的独特元素.我想从这个向量中获取20个唯一且随机的元素."独特"我的意思是我不想多次获取相同的索引.目前,我这样做是为了打电话std::random_shuffle.但这需要我将整个矢量(可能包含1000多个元素)混洗.我不介意改变向量(我不喜欢,因为我不需要使用线程锁),但最重要的是我希望它有效.我不应该比我需要的更多地洗牌.
请注意,我已经考虑过传入一个部分范围,std::random_shuffle但它只会洗掉那个元素子集,这意味着该范围之外的元素永远不会被使用!
感谢帮助.谢谢!
注意:我使用的是Visual Studio 2005,因此我无法访问C++ 11的功能和库.
我需要在 javascript(或 Typescript)中获取唯一的随机数。
此时我使用这段代码:
var id = -((new Date()).getTime() & 0xffff);
Run Code Online (Sandbox Code Playgroud)
它返回给我类似-13915或这样的数字-28806...
它在大多数情况下都有效,但是当此代码在承诺中执行时(因此几乎同时执行多次),我遇到了问题。有时我会得到两个相同的 id。
有什么解决方案可以在任何情况下获得唯一的随机数吗?
我很难提出一种可以创建简短(8个字符)引荐代码的算法。我想使用一种易于记忆的模式,在该模式中不可能在代码中出现令人反感的单词。我也不想让任何字母与数字混淆-所以不要1,l,0和O。我提出的模式是aa22aa22。此模式基本上是两个字母字符,然后是两个数字字符,然后是两个字母字符,然后是两个数字字符。字母字符均为小写。这种模式支持超过40亿种可能的代码。
现在开始棘手的部分。我需要将生成的代码存储在Salesforce中。我认为这需要以非随机的方式完成,因为如果我随机进行,则必须检查是否已经生成了代码。然后,这会进入Salesforce对您施加的限制条件限制。如果您不熟悉调控器限制,则基本上意味着您查询数据库的次数过多或进程运行的时间过长,基础系统会抛出调控器限制错误。随机代码的创建带来了不确定性,即查找与先前创建的代码不冲突的代码需要进行多少次查询。因此,现在基本上可以归结为创建保证永不重复的代码,这意味着需要按顺序创建它们。顺序方法的问题在于代码易于猜测。
是的,我可以有一个非Salesforce数据存储,它可以作为记录的来源,并采用随机方法进行冲突检查,但是我想看看全球社区是否有任何可行的想法。我试图找到一种弱对称加密算法,该算法可以产生8个字符的密码,但到目前为止我还没有运气。
假设我想生成一个包含 1000 个唯一数字的随机列表(数字可以是 1 到 1000 的范围)。我可以通过将范围从 1 到 1000 扩展到实际列表,然后随机打乱元素来做到这一点。语言并不重要,但在 python 中它可能是这样实现的:random.shuffle(list(range(1000)))。
但是,如果我需要生成 100 亿个数字怎么办?将范围扩展到列表将需要大量内存(如果以 8 字节存储数字,则大约需要 74 GB 内存)。洗牌还需要大量的内存和时间。但并不需要一次生成所有的数字,而是最好一个一个地生成,保存状态,而不是存储所有数字而填满内存,而只存储一个。
数字仍然需要唯一。有没有用于此目的的算法?
如果有一种方法可以在给定的生成步骤中快速恢复生成器的“状态”,那就太好了。例如,如果我已经生成了 100 万个数字,而下一个数字必须是 10,那么如果我能够有效地(无需再次重新生成该百万个数字)以 100 万为步长恢复状态并生成下一个数字,那就太好了 - 10.
有这样的算法吗?