为什么我的排序数组偶尔会返回随机0?

时间:2014-03-19 14:02:21

标签: objective-c

我编写了一个程序,用于对从最大到最小的50个整数的随机生成数组进行排序。到目前为止它可以工作,但偶尔会在排序数组的末尾返回随机零。未排序的数组中不存在这些零,并且它们并不总是出现。这是我的计划:

#import <Foundation/Foundation.h>

@interface Number: NSObject

- (void) start;
- (int) getValue;
- (void) counted;
- (void) placeValue: (int) a;

@end

@implementation Number
{
    int x;
}

- (void) start
{
    x = arc4random_uniform(1000);
    if (x == 1)
    {
        x = x+1;
    }
}

- (int) getValue
{
    return x;
}

- (void) counted
{
    x = 0;
}

- (void) placeValue: (int) a
{
    x = a;
}

@end

int main(int argc, const char * argv[])
{

    @autoreleasepool
    {
        NSMutableArray *unsortedArray = [[NSMutableArray alloc] initWithCapacity: 50];

        for (int n = 0; n < 50; n++)
        {
            Number *num = [[Number alloc] init];
            [num start];
            [unsortedArray addObject: num];
        }

        for  (int n = 0; n < 50; n++)
        {
            printf("%i, ", [unsortedArray[n] getValue]);
        }
        printf ("unsorted array.\n\n");

        int x = 0;
        int y = 1001;

        for (int n = 0; n < 50; n++)
        {
            for (int m = 0; m < 50; m++)
            {
                if (([unsortedArray[m] getValue] > x) && ([unsortedArray[m] getValue] < y))
                {
                    x = [unsortedArray[m] getValue];
                }
            }

            printf("%i, ", x);
            y = x;
            x = 0;
        }

        printf("sorted array.\n");
    } return 0;
}

3 个答案:

答案 0 :(得分:0)

- (void) start
{
    x = arc4random_uniform(1000);
    if (x == 0)
      x = x + 1;
}

答案 1 :(得分:0)

每个人都关注arc4random_uniform可以将零作为可接受的值(这是真的)生成的事实,但还有另一个问题:您的排序算法不正确,因为它只有在数组是唯一的。但是,如果您有任何重复值(并且无法保证arc4random_uniform不会生成某些重复项),您的算法将只显示其中一个值,因此,当您到达结束时,会看到一堆额外的零。

有很多不同的sorting algorithms,但是可能更容易利用其中一种本地NSMutableArray排序方法,这可以让你摆脱编写自己的杂草。

答案 2 :(得分:0)

试试这个:

- (void)start
{
    x = (arc4random_uniform(1000) + 1);
}

当您点击0或1时,您不希望仅增加x,因为这会使结果产生偏差。在这种情况下,arc4random_uniform将返回小于1000的随机数,因此0 - > 999,为所有值加1,给你1 - &gt; 1000.调整你的数字以满足你的需要。

您的代码中还有其他问题。为什么要创建自己的Number类?为什么要创建自己的排序方法?使用NSNumber和NSArray的排序方法。

这是一个更清洁的版本:

int main(int argc, const char * argv[])
{
    @autoreleasepool
    {
        NSMutableArray* unsortedArray = [[NSMutableArray alloc] initWithCapacity:50];

        for (NSUInteger n = 0; n < 50; ++n) {
            [unsortedArray addObject:@(arc4random_uniform(999) + 1)];
        }

        for (NSUInteger n = 0; n < 50; ++n) {
            printf("%li, ", (long)[unsortedArray[n] integerValue]);
        }
        printf ("unsorted array.\n\n");

        NSArray* sortedArray = [unsortedArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
            return [obj2 compare:obj1];
        }];

        for (NSUInteger n = 0; n < 50; ++n) {
            printf("%li, ", (long)[sortedArray[n] integerValue]);
        }
        printf("sorted array.\n");
    } 

    return 0;
}