在我的应用程序中,您首先获得一个开始按钮,当您点击“开始”时,该应用程序将在0到23之间随机化整数fraga1-fraga40(这将用作问题)。 fraga1到fraga12不能相同。 fraga13到fraga22不能相同。 fraga23到fraga28不能相同。 fraga29到fraga40不能相同。
然后过一会儿,你得到另一个开始按钮..当你按下那个时,fraga41-fraga81将在0到23之间随机化。 fraga41到fraga52不能相同.` fraga53到fraga62不能相同。 fraga63到fraga68不能相同。 fraga69到fraga80不能相同。
但是当你第二次点击开始按钮时,按钮保持“点击”(或“突出显示”)并且应用模拟器冻结。
我正在使用这样的代码......
-(void) v1
{
fraga1=arc4random()%24;
[self v2];
}
-(void) v2
{
fraga2=arc4random()%24;
if(fraga2==fraga1)
{
[self v2];
}
[self v3];
}
-(void) v3
{
fraga3=arc4random()%24;
if(fraga3==fraga2||fraga3==fraga1)
{
[self v3];
}
[self v4];
}
从第一个按钮一直到40 ......从另一个按钮从v41到v80!
你觉得我能解决这个问题吗?我应该改变我随机化问题的策略吗?我试图改变它,所以它会像30个数字一样随机化,但它仍然是相同的......当我在每个问题上尝试100个数字时......它有效,但有点慢!
提前致谢!
/ a noob
编辑: 我这样做了,但每个fraga都设置为0:
void fillUniqueRand(uint32_t arr[], uint32_t l, uint32_t n)
{ uint32_t in,il = 0;
for(in = 0; in < n && il < l; ++in)
{
uint32_t rn = n - in;
uint32_t rl = l - il;
if(arc4random() % rn < rl)
arr[il++] = in;
}
//We now have random numbers in order and
//need to shuffle them
uint32_t j, tmp;
for(uint32_t i = l - 1; i > 0; i--)
{
j = arc4random() % (i + 1);
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
} //从方法中调用它 - (无效)vnr { uint32_t的 fraga1,fraga2,fraga3,fraga4,fraga5,fraga6,fraga7,fraga8,fraga9,fraga10,fraga11,fraga12,fraga13,fraga14,fraga15,fraga16,fraga17,fraga18,fraga19,fraga20,fraga21,fraga22,// ... fraga23,fraga24,fraga25,fraga26,fraga27,fraga28,fraga29,fraga30,fraga31,fraga32,fraga33,fraga34,fraga35,fraga36,fraga37,fraga38,fraga39,fraga40; // ... ;
//Max fraga range I noticed was 12
uint32_t unique[12] = { 0 };
fillUniqueRand(unique, 12u, 24u);
fraga1 = unique[0];
fraga2 = unique[1];
fraga3 = unique[2];
fraga4 = unique[3];
fraga5 = unique[4];
fraga6 = unique[5];
fraga7 = unique[6];
fraga8 = unique[7];
fraga9 = unique[8];
fraga10 = unique[9];
fraga11 = unique[10];
fraga12 = unique[11];
//...
fillUniqueRand(unique, 10, 24u);
fraga13 = unique[0];
fraga14 = unique[1];
fraga15 = unique[2];
fraga16 = unique[3];
fraga17 = unique[4];
fraga18 = unique[5];
fraga19 = unique[6];
fraga20 = unique[7];
fraga21 = unique[8];
fraga22 = unique[9];
//Only 6 elements between fraga23-fraga28
fillUniqueRand(unique, 6, 21u);
fraga23 = unique[0];
fraga24 = unique[1];
fraga25 = unique[2];
fraga26 = unique[3];
fraga27 = unique[4];
fraga28 = unique[5];
fillUniqueRand(unique, 12u, 24u);
fraga29 = unique[0];
fraga30 = unique[1];
fraga31 = unique[2];
fraga32 = unique[3];
fraga33 = unique[4];
fraga34 = unique[5];
fraga35 = unique[6];
fraga36 = unique[7];
fraga37 = unique[8];
fraga38 = unique[9];
fraga39 = unique[10];
fraga40 = unique[11];
//...
//You get the picture
}
答案 0 :(得分:1)
根据Unique random numbers in an integer array in the C programming language的答案,您应该实现更有效的算法,这样您就不会陷入无限循环,并避免在范围结束时花费大量的计算时间。以下是可能适合您的实现示例。
/*!
@param arr Array to be filled with unique random numbers
@param l Number of elements to fill in the array
@param n The max of range the random number
(if there is a minimum range then just add it to each resulting arr index)
*/
void fillUniqueRand(uint32_t arr[], uint32_t l, uint32_t n)
{
uint32_t in, il = 0;
for(in = 0; in < n && il < l; ++in)
{
uint32_t rn = n - in;
uint32_t rl = l - il;
if(arc4random() % rn < rl)
arr[il++] = in;
}
//We now have random numbers in order and
//need to shuffle them
uint32_t j, tmp;
for(uint32_t i = l - 1; i > 0; i--)
{
j = arc4random() % (i + 1);
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
//Calling this from a method
-(void) v1
{
uint32_t
fraga1, fraga2, fraga3, //...
fraga23, fraga24, fraga25 //,...
;
//Max fraga range I noticed was 12
uint32_t unique[12] = { 0 };
fillUniqueRand(unique, 12u, 24u);
//fill fraga1 - fraga12
fraga1 = unique[0];
fraga2 = unique[1];
fraga3 = unique[2];
//...
//Only 6 elements between fraga23-fraga28
fillUniqueRand(unique, 6, 24u);
//fill fraga23 - fraga28
fraga23 = unique[0];
fraga24 = unique[1];
fraga25 = unique[2];
//...
//You get the picture
}
答案 1 :(得分:0)
我建议你使用一个可变数组来处理你的整数fragaXY。您不能将整数直接添加到数组中,但可以在执行此操作后添加它们:
[myArray addObject:[NSNumber numberWithInt:fragaXY]];
所以我建议你从数组开始,用随机数填充它(而不是随着时间生成它们),并修复任何匹配的数字,使用for循环
NSMutableArray *myArray = [[NSMutableArray alloc] initWithCapacity:80];
for (int i=0;i<80;i++) {
[myArray addObject:[NSNumber numberWithInt:(arc4random%24)]];
}
完成后,要检查您的要求是否满意,可以写下:
if([myArray objectAtIndex:0].intValue != [myArray objectAtIndex:11].intValue) {
//checking if they fraga1 is different than fraga12 and so on... here you can change one of the values..
}
这将使您的代码更清晰。