相关疑难解决方法(0)

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

我想生成0到1000之间永远不会重复的唯一随机数(即6不会出现两次),但这并不是像以前的值的O(N)搜索那样.这可能吗?

language-agnostic random algorithm math

174
推荐指数
9
解决办法
9万
查看次数

在Python中生成非重复随机数

好吧,这是一个比它听起来更棘手的问题,所以我转向堆栈溢出,因为我想不出一个好的答案.这就是我想要的:我需要Python以随机顺序生成一个简单的0到1,000,000,000的数字列表,用于序列号(使用随机数,这样你就无法分辨已经分配了多少或做了时间攻击很容易,即猜测下一个会出现的问题).这些数字与链接到它们的信息一起存储在数据库表(索引)中.生成它们的程序不会永远运行,因此它不能依赖于内部状态.

没什么大不了的?只需生成一个数字列表,将它们推入一个数组并使用Python"random.shuffle(big_number_array)",我们就完成了.问题是我想避免必须存储一个数字列表(从而读取文件,弹出一个顶部,保存文件并关闭它).我宁愿在飞行中生成它们.问题是我能想到的解决方案有问题:

1)生成一个随机数,然后检查它是否已被使用.如果已经使用它生成一个新的数字,检查,根据需要重复,直到找到一个未使用的数字.这里的问题是,在获得未使用的数字之前,我可能会感到不幸并生成大量使用过的数字.可能的解决方法:使用一个非常大的数字池来减少这种情况的可能性(但最后我得到了愚蠢的长数字).

2)生成一个随机数,然后检查它是否已被使用.如果已经使用了从数字中添加或减去一个并再次检查,请继续重复,直到我点击未使用的数字.问题是这不再是随机数,因为我已经引入了偏见(最终我会得到一堆数字,你可以预测下一个数字有更大的成功机会).

3)生成一个随机数,然后检查它是否已被使用.如果它已被使用添加或减去另一个随机生成的随机数并再次检查,问题是我们回到简单地生成随机数并检查解决方案1.

4)将其取出并生成随机列表并保存,让守护程序将它们放入队列中,以便有可用的数字(并避免不断打开和关闭文件,而是将其批处理).

5)生成更大的随机数并散列它们(即使用MD5)来获得更小的数值,我们应该很少得到冲突,但最终我的数字大于所需的数字.

6)在随机数(即unix时间戳)之前添加或附加基于时间的信息以减少碰撞的可能性,同样我得到的数字比我需要的数字更多.

任何人都有任何聪明的想法,可以减少"碰撞"的机会(即产生一个已经采取的随机数),但也可以让我保持这个数字"小"(即少于十亿(或十亿)你的欧洲人=)).

答案以及为什么我接受它:

因此,我将简单地选择1,并希望它不是一个问题,但是如果是的话,我会选择生成所有数字并存储它们的确定性解决方案,以便有一个获得新的随机数的保证,我可以使用"小"数字(即9位数而不是MD5 /等).

python random numbers

38
推荐指数
6
解决办法
3万
查看次数

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万
查看次数

arc4random()和arc4random_uniform()不是真的随机吗?

我一直在使用arc4random()arc4random_uniform(),我总觉得它们不是完全随机的,例如,我是从一个数组中随机选择值,但是当我生成它们时,经常出现的值是相同的连续多次,所以今天我认为我会使用Xcode游乐场来看看这些函数是如何表现的,所以我首先测试arc4random_uniform来生成0到4之间的数字,所以我使用了这个算法:

import Cocoa

var number = 0

for i in 1...20 {
    number = Int(arc4random_uniform(5))
}
Run Code Online (Sandbox Code Playgroud)

我跑了几次,这里是大多数时候价值观的变化:
在此输入图像描述 在此输入图像描述

因此,您可以看到值重复增加和减少,并且一旦值处于最大值/最小值,它们通常会在特定时间内保持不变(请参阅第5步中的第一个屏幕截图,值在6期间保持为3)步骤,问题是它一点都不寻常,在我的测试中,函数实际上大部分时间都是这样.

现在,如果我们看一下arc4random(),它基本上是一样的:
在此输入图像描述 在此输入图像描述

所以这是我的问题:

  • 为什么这个函数会以这种方式运行?
  • 如何让它更随机?

谢谢.

编辑:
最后,我做了两个令人惊讶的实验,第一个带有真正的骰子:
在此输入图像描述
让我感到惊讶的是,我不会说它是随机的,因为我看到了与arc4random()和arc4random_uniform()所描述的非随机相同的模式,所以Jean-BaptisteYunès指出,人类不好看,数字序列是否真的是随机的.

我还想做一个更"科学"的实验,所以我做了这个算法:

import Foundation

var appeared = [0,0,0,0,0,0,0,0,0,0,0]
var numberOfGenerations = 1000

for _ in 1...numberOfGenerations {
    let randomNumber = Int(arc4random_uniform(11))
    appeared[randomNumber]++
}

for (number,numberOfTimes) in enumerate(appeared) {
    println("\(number) appeard \(numberOfTimes) times (\(Double(numberOfGenerations)/Double(numberOfTimes))%)")
}
Run Code Online (Sandbox Code Playgroud)

要查看每个数字出现的次数,并且有效地数字是随机生成的,例如,这里是控制台的一个输出:
0出现99次.
1次出现了97次.
2次出现了78次.
3次出现了80次.
4次出现了87次.
5次出现107次.
6次出现了86次.
7次出现了97次.
8次出现了100次.
9次出现91次. …

random darwin swift swift-playground

12
推荐指数
1
解决办法
4879
查看次数

Shuffle NSMutableArray objective-c

可能重复:
什么是洗牌NSMutableArray的最佳方式?
非重复随机数

如何获取NSMutableArray的随机索引而不重复?我有NSMutableArray*audioList.我想以随机模式播放每首曲目,而不重复.如何以最好的方式做到这一点?

random shuffle objective-c nsmutablearray

3
推荐指数
1
解决办法
3232
查看次数

在目标c中生成唯一的随机数?

我想生成一个介于31到60之间的随机数.

所以我使用了rand(),但我认为它会给出一些时间相同的价值.但我需要时间它应该给我新的价值.

我怎样才能做到这一点?

iphone objective-c

2
推荐指数
1
解决办法
7048
查看次数

Objective-C如何从NSArray中提取几个随机项而不会出现重复项?

我有一系列随机属性我想分配给我正在开发的游戏中的设备.

我在下面使用的代码是返回NSArray.我很感兴趣,如果有方法从该数组中获取项索引而不获取重复值.显而易见的解决方案是使用返回的数组创建一个可变数组,执行随机操作,删除返回的项目并循环直到收到项目数.

但是有没有不同的方法从NSArray获取X随机项而不会重复?

//get possible enchantments
NSPredicate *p = [NSPredicate predicateWithFormat:@"type = %i AND grade >= %i", kEnchantmentArmor,armor.grade];

NSArray* possibleEnchantments = [[EquipmentGenerator allEnchantmentDictionary] objectForKey:@"enchantments"];

//get only applicable enchantments
NSArray *validEnchantments = [possibleEnchantments filteredArrayUsingPredicate:p];
NSMutableArray* mutableArray = [NSMutableArray arrayWithArray:validEnchantments];

NSDictionary* enchantment = nil;

if(mutableArray.count>0)
{
    //got enchantments, assign number and intensity based on grade
    for (int i = 0; i<3;i++)
    {
        enchantment = mutableArray[arc4random()%mutableArray.count];
        [mutableArray removeObject:enchantment];

        //create enchantment from dictionary and assign to item.
    }

}
Run Code Online (Sandbox Code Playgroud)

random objective-c nsarray ios

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

在C中生成唯一的随机数

我尝试在C中生成10个唯一的随机数.我有一个numout[]10个数字的数组,但是经过一段时间后会出现"分段错误".

代码是:

int i,j,numout[10],randnum;

void main()
{
    srand(time(NULL));  
    for(i=0;i<10;i++)
    {
        numout[i]=generate();
        printf("%d",numout[i]);
        fflush(stdout);
        sleep(1);
        printf("\b");
    }
}
int generate()
{
    randnum=1+(int)(rand()*mul_val/(RAND_MAX+1.0));
    for(j=0;j<i;j++)
    {
        if(randnum==0 || randnum==numout[j])
        {
            randnum=generate();     
        }
    }
    return(randnum);
}
Run Code Online (Sandbox Code Playgroud)

c

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

Objective-c中的数独生成

我应该制作一个生成完全数独谜题的应用程序.我可以使用以下代码正确生成第一行,但是,无论我做什么,我都无法使下一行正常工作.他们都生成了正确的方法,因为我以随机的顺序得到数字1-9,但我无法让它制作一个可行的数独谜题.

码:

NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:8];
    for (int integerA = 0; integerA < 10; integerA ++) {
        [array addObject:[NSNumber numberWithInt:integerA]];
        //NSLog(@"%i", (integerA + 1));
    }

 for (int x = 8; x >= 0; x --) {
        [array exchangeObjectAtIndex:(arc4random() % (x + 1)) withObjectAtIndex:x];
        section[x][0] = ([[array objectAtIndex:x] intValue] + 1);
        for (int y = 8; y >= 0; y --) {
            if (0) {

            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

那部分有效.如果我尝试创建另一个数组并为每个"x"值生成"y"值,那就太奇怪了.如果没有多条条件语句,是否有一种有效的方法来生成完全解决的数独谜题?

"奇怪的结果":

2 0 1 | 2 3 3 | 5 …
Run Code Online (Sandbox Code Playgroud)

cocoa objective-c

-1
推荐指数
1
解决办法
2176
查看次数