2012-05-02 4 views
0

Я хочу убедиться, что «сетка» не может вернуть 2 одинаковых значения, но я не уверен, как это сделать. Вот мой код:Получите 2 уникальных номера подряд?

grid[rnd(2,x-2) * y + rnd(2,y-2)].height = rnd(25,40);

int rnd(int min, int max) { 
    return min + rand() % (max - min + 1); 
} 

Я также высевают рандов() с srand(time(NULL));

Я хотел бы представить более подробную информацию или то, что я пытался, но я не мог найти что-нибудь связанное с Эта тема.

EDIT: Я мог бы, конечно, сделать повторную РАНДОМИЗАЦИЮ, но я чувствую, что это плохая практика:/

+1

(Pseudo-) случайность ортогональна с уникальностью. – ildjarn

ответ

6

Если вам действительно нужно, чтобы избежать последовательных повторов, все, что вам нужно сделать, это передать предыдущее значение в вашу функцию, а затем генерировать случайные числа в цикле до тех пор, пока он не будет отличным.

Псевдо-код:

int rnd(..., int prev) { 
    int y; 
    do { 
     y = rand() ...; 
    } while (y == prev); 
    return y; 
} 

Обратите внимание, что вы могли бы в качестве альтернативы поддерживать prev как статические переменные внутри функции. Но это сделало бы невозможным одновременное создание нескольких независимых потоков.


1. Что на самом деле делает вещи менее «случайными», в смысле становления более предсказуемыми.

+0

или перетасовать уникальный список и выбрать случайные значения из списка. – KillianDS

+0

@KillianDS: Действительно. Хотя у меня создается впечатление, что OP просто хочет избежать * последовательных * дубликатов, поэтому подход, похожий на Фишера-Йейтса, может быть излишним. –