是否有更快的方式来随机化一组有序数字?

时间:2017-02-13 14:21:30

标签: arrays random big-o

我制作的这款游戏目前在App Store上名为“Twinstones”,并且有一个“石头”选择商店页面,允许您选择您想玩的石头组(60种选择)。

我编写了一个随机函数,使石头选项位于不同用户的不同列行位置。就Big-O约束而言,我的函数在对数尺度上被认为是线性的吗?或者,如果输入10000而不是60,会增加超出合理手段的时间吗?我对这个时间管理代码世界很陌生,所以请耐心等待:

#define STONES 60

- (void)randomizeStones {
    srand((unsigned int)time(NULL));

    char stone[STONES];
    char tester[STONES] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
                       21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,
                       39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,
                       57,58,59};


    int tracker = STONES;
    for (int i = 0; i < STONES; i++) {
        int r = rand() % tracker;
        stone[i] = tester[r];
        tester[r] = ' ';
        for (int j = r; j < tracker; j++) {
           tester[j] = tester[j+1];
           tester[j+1] = ' ';
        }
        tracker--;
    }
    // print out Stones order to verify (this function works just to throw that in there)
}
  1. 鉴于60号码设置,我得到当前金额的随机数。
  2. 该号码从tester数组“转移”到stone数组的第一个元素。
  3. 然后,我从tester中的索引位置删除该号码。
  4. 第二个for循环使索引中的值大于所选索引,并以tester数组顺序将它们“移动”到左侧。
  5. 然后tracker减1,以防止第二个for循环不断运行60次。
  6. 这个过程的效率如何(假设我希望n个Stones可以独立随机化,而无需随机选择并继续查找唯一值)?

0 个答案:

没有答案