相关疑难解决方法(0)

创建没有重复的随机数

在这种情况下,MAX只有5,所以我可以逐个检查重复,但我怎么能以更简单的方式做到这一点?例如,如果MAX的值为20,该怎么办?谢谢.

int MAX = 5;

for (i = 1 , i <= MAX; i++)
{
        drawNum[1] = (int)(Math.random()*MAX)+1;

        while (drawNum[2] == drawNum[1])
        {
             drawNum[2] = (int)(Math.random()*MAX)+1;
        }
        while ((drawNum[3] == drawNum[1]) || (drawNum[3] == drawNum[2]) )
        {
             drawNum[3] = (int)(Math.random()*MAX)+1;
        }
        while ((drawNum[4] == drawNum[1]) || (drawNum[4] == drawNum[2]) || (drawNum[4] == drawNum[3]) )
        {
             drawNum[4] = (int)(Math.random()*MAX)+1;
        }
        while ((drawNum[5] == drawNum[1]) ||
               (drawNum[5] == drawNum[2]) ||
               (drawNum[5] == drawNum[3]) ||
               (drawNum[5] == drawNum[4]) )
        {
             drawNum[5] = (int)(Math.random()*MAX)+1; …
Run Code Online (Sandbox Code Playgroud)

java random

82
推荐指数
6
解决办法
25万
查看次数

如何从数组中随机获取n个元素

我正在研究'如何在javascript中从数组中随机访问元素'.我找到了很多相关的链接.喜欢: 从JavaScript数组中获取随机项

var item = items[Math.floor(Math.random()*items.length)];
Run Code Online (Sandbox Code Playgroud)

问题:但是在这里我们只能从数组中选择一个项目.如果我们想要多个元素,那么我们怎样才能实现这个.所以请从这个语句中我们如何从数组中获得多个元素.

html javascript arrays jquery

66
推荐指数
10
解决办法
5万
查看次数

创建无重复的随机数序列

重复:

O(1)中的唯一随机数?

我想要一个伪随机数生成器,它可以按随机顺序生成没有重复的数字.

例如:

随机(10)

可能会返回5,9,1,4,2,8,3,7,6,10

有没有更好的方法来做到这一点,除了使数字的范围和洗牌,或检查生成的列表重复?


编辑:

此外,我希望它在没有整个范围的情况下有效地生成大数字.


编辑:

我看到每个人都建议使用随机算法.但是,如果我想生成大的随机数(1024字节+),那么该方法将占用更多的内存,而不是我刚使用常规RNG并插入到Set中,直到它是指定的长度,对吧?对此没有更好的数学算法.

c c++ random algorithm

38
推荐指数
5
解决办法
7万
查看次数

选择单个随机值组合的算法?

说我有y不同的值,我想x随机选择它们.这样做的有效算法是什么?我可以打电话给rand() x时间,但如果很大x,表现会很差y.

请注意,此处需要组合:每个值应具有相同的概率,但结果中的顺序并不重要.当然,任何生成算法都是合格的,但我想知道如果没有随机顺序要求,是否可以更有效地做到这一点.

如何有效地生成0和上限N之间的K个非重复整数的列表,涵盖了这种情况的排列.

algorithm combinations

35
推荐指数
2
解决办法
2万
查看次数

如何有效地生成0和上限N之间的K个非重复整数列表

该问题给出了所有必要的数据:在给定区间[0,N-1]内生成一系列K个非重复整数的有效算法是什么.平凡算法(产生随机数,并把它们添加到序列,看着他们,看看他们是否已经在那里之前)是非常昂贵的,如果ķ大且足够接近ñ.

从链表有效地选择一组随机元素中提供的算法似乎比必要的更复杂,并且需要一些实现.我刚刚发现了另一种似乎可以完成工作的算法,只要您知道所有相关参数,只需一次通过即可.

arrays random algorithm permutation

29
推荐指数
3
解决办法
2万
查看次数

在.NET中生成所有整数的随机,非重复序列

在.NET中是否有一种方法可以以随机顺序生成所有 32位整数(Int32)的序列,而不会重复,并且以内存效率的方式生成?内存效率意味着最多只能使用几百兆字节的主内存.

理想情况下,序列应该像a一样IEnumerable<int>,只有在请求时才会延迟返回下一个数字.

我做了一些快速研究,我找到了一些部分解决方案:

有另一种方式来看待这个问题 - 也许是考虑值的固定范围内的优势 - 这将给予满足存储需求的解决方案?也许.NET类库带有一些有用的东西?

更新1

感谢大家对解决方案的见解和创意建议.我将尝试尽快实施和测试(正确性和内存效率)这里提出的2或3个最有希望的解决方案,发布结果然后选择"赢家".

更新2

我试着在下面评论中实现hvd的建议.我尝试使用BitArray.NET和我的自定义实现,因为.NET只限于int.MaxValue条目,因此不足以覆盖整个整数范围.

我喜欢这个想法的简单性,如果它工作正常,我愿意"牺牲"那512 MB的内存.不幸的是,运行时间非常慢,花费数十秒来生成我的机器上的下一个随机数,它具有3.5 GHz Core i7 CPU.所以不幸的是,如果要求生成许多随机数,这是不可接受的.我猜这是可以预测的,如果我没有弄错的话,它是一个O(M x N)算法,其中N是2 ^ 32而M是请求的整数的数量,因此所有这些迭代都需要付出代价.

理想情况下,我想在O(1)时间内生成下一个随机数,同时仍满足内存要求,这里建议的下一个算法可能适用于此.我会尽快给他们试一试.

更新3

我刚刚测试了线性同余发生器,我可以说我对结果非常满意.对于这个帖子中的赢家位置来说,它看起来像是一个强有力的竞争者.

正确性:所有整数只生成一次(我使用了一个位向量来检查).

随机性:相当不错.

内存使用:非常好,只需几个字节.

运行时间:非常快速地生成下一个随机整数,正如您可以从O(1)算法中获得的那样.生成每个整数总共花费大约.在我的机器上11秒.

总而言之,如果你不是在寻找高度随机化的序列,我会说这是一种非常合适的技术.

更新4

下面描述的模乘乘逆技术与LCG技术的行为非常相似 - 这并不奇怪,因为两者都是基于模运算 - 尽管我发现为了产生令人满意的随机序列,它实现起来并不那么简单.

我发现一个有趣的区别是这种技术似乎比LCG更快:生成整个序列需要大约8秒,而LCG则需要11秒.除此之外,关于内存效率,正确性和随机性的所有其他评论都是相同的.

更新5

看起来用户TomTom在没有通知的情况下删除了他们的答案,我在评论中指出我发现它比所需的更快地生成重复的数字.所以我想这完全排除了Mersenne Twister. …

.net c# random algorithm int

29
推荐指数
2
解决办法
2863
查看次数

C编程语言中整数数组中的唯一随机数

可能重复:
O(1)中的唯一随机数?

如何在C中填充具有唯一值(无重复项)的整数数组?

int vektor[10];   

for (i = 0; i < 10; i++) {
    vektor[i] = rand() % 100 + 1;
}

//No uniqueness here
Run Code Online (Sandbox Code Playgroud)

c random algorithm

28
推荐指数
2
解决办法
8万
查看次数

没有替换的采样算法?

我试图测试特定数据集群偶然发生的可能性.一种强有力的方法是蒙特卡罗模拟,其中数据和组之间的关联被随机重新分配很多次(例如10,000),并且使用聚类度量来比较实际数据与模拟以确定ap值.

我已经完成了大部分工作,使用指针将分组映射到数据元素,因此我计划随机重新分配指向数据的指针.问题:在没有替换的情况下采样的快速方法是什么,以便在复制数据集中随机重新分配每个指针?

例如(这些数据只是一个简化的例子):

数据(n = 12值) - A组:0.1,0.2,0.4/B组:0.5,0.6,0.8/C组:0.4,0.5/D组:0.2,0.2,0.3,0.5

对于每个复制数据集,我将具有相同的簇大小(A = 3,B = 3,C = 2,D = 4)和数据值,但会将值重新分配给簇.

为此,我可以生成1-12范围内的随机数,分配A组的第一个元素,然后生成1-11范围内的随机数,并分配A组中的第二个元素,依此类推.指针重新分配很快,我将预先分配所有数据结构,但没有替换的采样似乎是一个可能已经解决过很多次的问题.

逻辑或伪代码首选.

algorithm statistics pseudocode

14
推荐指数
3
解决办法
2万
查看次数

生成大的随机序列的唯一数字

我需要填写一个文件,其中包含许多由数字标识的记录(测试数据).记录的数量非常大,而且ID应该是唯一的,记录的顺序应该是随机的(或伪随机的).

我试过这个:

# coding: utf-8
import random

COUNT = 100000000

random.seed(0)
file_1 = open('file1', 'w')
for i in random.sample(xrange(COUNT), COUNT):
    file_1.write('ID{0},A{0}\n'.format(i))
file_1.close()
Run Code Online (Sandbox Code Playgroud)

但它正在吃掉我所有的记忆.

有没有办法生成一个连续的大洗牌序列(不一定但它会很好,否则是唯一的)整数?使用发生器而不是将所有序列保留在RAM中?

python random

13
推荐指数
1
解决办法
3854
查看次数

Objective-C中的非重复随机数

我正在使用

for (int i = 1, i<100, i++)
    int i = arc4random() % array count;
Run Code Online (Sandbox Code Playgroud)

但我每次都会重复.如何int从范围中填写所选的值,以便在程序循环时我不会得到任何欺骗?

random objective-c

7
推荐指数
1
解决办法
1万
查看次数