如何为多个图像创建随机数以在 Grid 中随机显示而不在 iOS 中重复?

Posted

技术标签:

【中文标题】如何为多个图像创建随机数以在 Grid 中随机显示而不在 iOS 中重复?【英文标题】:How to create random numbers for multiple images to show randomly in Grid without repetition in iOS? 【发布时间】:2017-10-11 05:51:10 【问题描述】:

我在 SpriteKit 中创建了 GridView。我的要求是在 Grid View 中随机打乱图像。

这是我随机显示图像而不重复的代码。但此代码仅适用于两个图像。对于多个图像,此代码不起作用。

        int RandomRowMainImage          = arc4random_uniform(3);
        int RandomColumnMainImage       = arc4random_uniform(3);

        //
        int RandomRowOtherImage         = arc4random_uniform(3);
        int RandomColumnOtherImage      = arc4random_uniform(3);

        NSLog(@"RandomRowMain:%d \n Random Column :%d \n RandomRow1:%d \n randomColumn1 :%d",RandomRowMainImage,RandomColumnMainImage,RandomRowOtherImage,RandomColumnOtherImage);

        //

        BOOL checkStatus = [self checkRandomNumberColumRowLogic:RandomRowMainImage withMainRow:RandomColumnMainImage withOtherColumn:RandomColumnOtherImage withOtherRow:RandomRowOtherImage];

        if (checkStatus) 
            imgIcons.position      = [self GridPosition:MainRowCount Column:MainColumnCount];
            imgOtherImage.position = [self GridPosition:otherRowCount Column:otherColumnCount];
        

比图像位置代码

//Grid Position
  -(CGPoint)GridPosition:(int)Row Column:(int)Column
 
CGFloat offset = SizeOfGrid / 2.0 + 0.5;
CGFloat  x = Column * SizeOfGrid - (SizeOfGrid*TotalCol)/2.0 + offset;
CGFloat  y = (TotalRows-Row-1) * SizeOfGrid -(SizeOfGrid*TotalRows)/2.0 + offset;

return  CGPointMake(x, y);

//检查防止两个图像的重复随机数重复的代码。

- (BOOL)checkRandomNumberColumRowLogic:(int)MainColumn withMainRow:(int)mainRow withOtherColumn:(int)otherColumn withOtherRow:(int)otherRow 

BOOL CompareRow    = false;
BOOL CompareColumn = false;

if (mainRow == otherRow) 
    int otherRow = 0;
    for (int i = 0; i < TotalCol; i++ ) 
        otherRow = [self checkRandomNumberCompare:otherRow];
        if (MainColumn == otherRow) 
            CompareRow = true;
            break;
        
    
    MainColumnCount = mainRow;
    otherColumnCount = otherRow;

else 
    CompareRow = true;
    MainRowCount = mainRow;
    otherRowCount = otherRow;


if (MainColumn == otherColumn) 
    int otherCol = 0;
    for (int i = 0; i < TotalCol; i++ ) 
        otherCol = [self checkRandomNumberCompare:otherColumn];
        if (MainColumn == otherCol) 
            CompareColumn = true;
            break;
        
    
    MainColumnCount = MainColumn;
    otherColumnCount = otherCol;

else 
    CompareColumn = true;
    MainColumnCount = MainColumn;
    otherColumnCount = otherColumn;


if(CompareRow == CompareColumn) 
    return  true;
 else  
    return false;


-(int)checkRandomNumberCompare:(int)compareRow 
int compareDiff = arc4random_uniform(TotalRows);
return compareDiff;

你能帮忙显示多张图片而不重复吗?就像 Node 中的一次一张图片

【问题讨论】:

【参考方案1】:

抱歉,您的 checkRandomNumberColumRowLogic: 方法的逻辑让我感到困惑。给定两个坐标 (x1, y1)(x2, y2) 当且仅当 x1 == x2y1 == y2,如果这不是秋天,那么它们代表不同的点。

以下是解决您的问题的可能算法的概要。首先考虑给定一个矩形网格单元格,其中行和列从 0 开始编号,然后每个单元格可以通过将其行索引乘以列数并添加到其列中来分配一个唯一编号指数。一张图值一千字,给定一个 3 x 3 的网格,你会得到编号:

0 1 2
3 4 5
6 7 8

请注意,给定一个单元格编号,它所代表的行和列可以使用整数除法和余数来计算。

执行上述操作可将您的问题减少为以某种随机顺序生成从 0rowCount x colCount - 1 的数字。

有很多方法可以做到这一点,这里是一种:

    upperLimit 设置为 rowCount x colCount - 10upperLimit之间生成一个随机数r 检查单元格r是否被占用,如果是则将1添加到r并重复此步骤 将下一张图片放入单元格rupperLimit 中减去 1,如果结果大于 0,则转到第 2 步(当然,这里的“goto”转换为“而”在代码中)

避免重复的关键是第 3 步,该算法保证第 3 步总能找到一个未占用的单元格 - 证明这是作为练习留下的。

HTH

【讨论】:

非常感谢。我会努力实施并通知您【参考方案2】:

我同意上面的答案,即您的逻辑过于复杂。如果您按照建议为每个图像提供索引,例如对于 3x4 网格:

0  1   2 
3  4   5 
6  7   8
9  10  11

然后您可以随机化网格并交换这些图像。以下代码将实现此目的:

-(void)createRandomGridArrays

    NSInteger columnLength = 3;
    NSInteger rowLength = 4;

    // Create an array of NSNumbers up to the max then randomise
    NSMutableArray *indexes = [NSMutableArray new];
    for (NSInteger i=0; i<columnLength*rowLength; i++) 
        [indexes addObject:@(i)];
    
    NSArray *randomIndexes = [self shuffleArray:indexes];
    NSLog(@"%@ -> %@", indexes, randomIndexes);    
    // (0,1,2,3,4,5,6,7,8,9,10,11) -> (1,0,6,10,4,2,7,11,9,5,8,3)

    // Convert indexes back to row/columns
    for (NSNumber *randomIndex in randomIndexes) 
        NSInteger index = [randomIndex integerValue];
        NSInteger row = index % rowLength;
        NSInteger column = index % columnLength;
        NSLog(@"%ld row:%ld, column:%ld", index, row, column);
    


-(NSArray*)shuffleArray:(NSArray*)array

    NSMutableArray *shuffledArray = [array mutableCopy];
    for (NSInteger i=shuffledArray.count-1; i>0; i--) 
        [shuffledArray exchangeObjectAtIndex:i withObjectAtIndex:arc4random_uniform(i+1)];
    
    return shuffledArray;

如果您有一个 NSMutableArray 图像,那么您只需将index 的图像与[randomIndexes[index] integerValue] 的图像交换即可。

【讨论】:

使用此代码后如何给图像定位 我给图像这样的位置:imgIcons.position = [self GridPosition:MainRowCount Column:MainColumnCount]; , 如何给行列值 更新了答案,包括使用模算术计算行/列。 您好,感谢您的回答。一张图片效果很好。但是我有两张或更多图片呢。如何给出位置 我不明白这条线。 “如果你有一个 NSMutableArray 的图像,那么你只需将索引处的图像与 [randomIndexes[index] integerValue] 处的图像交换”

以上是关于如何为多个图像创建随机数以在 Grid 中随机显示而不在 iOS 中重复?的主要内容,如果未能解决你的问题,请参考以下文章

如何为使用 Django-CKEditor 上传的图像创建 uuid4 文件名?

如何快速从文件夹中获取随机图像?

Plotly:如何为使用多条轨迹创建的图形设置调色板?

如何为 iPhone 5 显示器加载 xib

如何为随机自定义 ListView 适配器设置按钮单击事件?

如何为 T-SQL 选择中的每一行生成一个随机数?