2012-01-29 89 views
1

我有一个大小为n的NSMutableArray urlArray,我想从数组中的元素总数中随机选择4个这样的URL。将NSNumbers数组重新排序并转换为整数

但是我不想直接洗牌urlArray,我更愿意做一个“indexArray” [0 ...(N-1)] &洗牌这些,&然后使用洗牌的前4种元素indexArray来决定我从urlArray中选择哪些元素。

首先,我创建了indexArray如下:

for (int i = 0; i < numberOfStems; i++) { 

    [indexArray addObject:[NSNumber numberWithInteger:i]]; 

} 

这让我重新洗牌我indexArray,到目前为止,一切顺利。因为我使用了 [NSNumber numberWithInteger:i]方法,混洗索引数组中的元素是NSNumbers。

有没有办法将indexArray中的NSNumber对象转换为ints?

我试图使用intValue函数,但这似乎并不是我所需要的。

我也尝试创建一个c样式的数组,但这并没有那么成功 - 如果可能的话,我想坚持使用objective-c语法。

任何想法?任何提示赞赏:)

+0

它的intValue。 – dasblinkenlight 2012-01-29 22:45:05

+3

您是否试过'[[indexArray objectAtIndex:i] integerValue]'?你得到的结果是你没有想到的? – user1118321 2012-01-29 22:45:44

+0

我尝试了intValue,但是返回的数字(类似于我记得的972378)表明了一个错误,此时我以为我处于错误的轨道上。你的建议确实奏效,所以非常感谢。 – Octave1 2012-01-30 13:55:55

回答

2

为什么你不只是创建一个正常的c数组,然后洗牌,然后使用数组中的前四个整数作为随机索引?

int* index = malloc(numberOfStems*sizeof(int)); 
for (int i = 0; i < numberOfStems; ++i) 
{ 
    index[i] = i; 
} 

for (int i = numberOfStems - 1; i > 0; --i) 
{ 
    int randomIndex = arc4random() % i; 
    int tmp = index[i]; 
    index[i] = index[randomIndex]; 
    index[randomIndex] = tmp; 
} 

现在使用索引来访问URL的

编辑:更新算法(虽然不是真的涉及到OP问题)

+2

你应该总是使用'arc4random()'而不是'rand()',因为它的结果更多(伪)随机。 – 2012-01-29 22:59:40

+0

混洗阶段不正确,会产生有偏差的结果。不过,[做正确](http://en.wikipedia.org/wiki/Fisher-Yates_shuffle#The_modern_algorithm)并不复杂得多。 – 2012-01-29 23:19:26

+0

事实证明,这是我的解决方案最优雅的方式,感谢您的帮助。 – Octave1 2012-01-30 14:10:01

2

对于只存储整数的临时数组在相对较短的任务后被抛弃,我肯定会更喜欢一个C风格的数组:这将避免大量的开销,也是简单阅读。

int *array = (int*)malloc(sizeof(int)*numberOfStems); 
for (int i = 0 ; i != numberOfStems ; i++) { 
    array[i] = i; 
} 
// Do the shuffle 
// Pick first four, and do whatever you need to do 
// ... 
// Now that you are done with the array, do not forget to free it: 
free(array); 
+1

如果在一个函数/方法中创建(小的)C数组,并且在该函数/方法返回之后不需要更改'malloc'并使用'alloca'并删除'free' - 'alloca''对象会自动释放当调用函数/方法返回时。 – CRD 2012-01-30 02:46:24