我想生成0到1000之间永远不会重复的唯一随机数(即6不会出现两次),但这并不是像以前的值的O(N)搜索那样.这可能吗?
好吧,这是一个比它听起来更棘手的问题,所以我转向堆栈溢出,因为我想不出一个好的答案.这就是我想要的:我需要Python以随机顺序生成一个简单的0到1,000,000,000的数字列表,用于序列号(使用随机数,这样你就无法分辨已经分配了多少或做了时间攻击很容易,即猜测下一个会出现的问题).这些数字与链接到它们的信息一起存储在数据库表(索引)中.生成它们的程序不会永远运行,因此它不能依赖于内部状态.
没什么大不了的?只需生成一个数字列表,将它们推入一个数组并使用Python"random.shuffle(big_number_array)",我们就完成了.问题是我想避免必须存储一个数字列表(从而读取文件,弹出一个顶部,保存文件并关闭它).我宁愿在飞行中生成它们.问题是我能想到的解决方案有问题:
1)生成一个随机数,然后检查它是否已被使用.如果已经使用它生成一个新的数字,检查,根据需要重复,直到找到一个未使用的数字.这里的问题是,在获得未使用的数字之前,我可能会感到不幸并生成大量使用过的数字.可能的解决方法:使用一个非常大的数字池来减少这种情况的可能性(但最后我得到了愚蠢的长数字).
2)生成一个随机数,然后检查它是否已被使用.如果已经使用了从数字中添加或减去一个并再次检查,请继续重复,直到我点击未使用的数字.问题是这不再是随机数,因为我已经引入了偏见(最终我会得到一堆数字,你可以预测下一个数字有更大的成功机会).
3)生成一个随机数,然后检查它是否已被使用.如果它已被使用添加或减去另一个随机生成的随机数并再次检查,问题是我们回到简单地生成随机数并检查解决方案1.
4)将其取出并生成随机列表并保存,让守护程序将它们放入队列中,以便有可用的数字(并避免不断打开和关闭文件,而是将其批处理).
5)生成更大的随机数并散列它们(即使用MD5)来获得更小的数值,我们应该很少得到冲突,但最终我的数字大于所需的数字.
6)在随机数(即unix时间戳)之前添加或附加基于时间的信息以减少碰撞的可能性,同样我得到的数字比我需要的数字更多.
任何人都有任何聪明的想法,可以减少"碰撞"的机会(即产生一个已经采取的随机数),但也可以让我保持这个数字"小"(即少于十亿(或十亿)你的欧洲人=)).
答案以及为什么我接受它:
因此,我将简单地选择1,并希望它不是一个问题,但是如果是的话,我会选择生成所有数字并存储它们的确定性解决方案,以便有一个获得新的随机数的保证,我可以使用"小"数字(即9位数而不是MD5 /等).
可能重复:
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) 我一直在使用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次. …
如何获取NSMutableArray的随机索引而不重复?我有NSMutableArray*audioList.我想以随机模式播放每首曲目,而不重复.如何以最好的方式做到这一点?
我想生成一个介于31到60之间的随机数.
所以我使用了rand(),但我认为它会给出一些时间相同的价值.但我需要时间它应该给我新的价值.
我怎样才能做到这一点?
我有一系列随机属性我想分配给我正在开发的游戏中的设备.
我在下面使用的代码是返回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) 我尝试在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) 我应该制作一个生成完全数独谜题的应用程序.我可以使用以下代码正确生成第一行,但是,无论我做什么,我都无法使下一行正常工作.他们都生成了正确的方法,因为我以随机的顺序得到数字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)