Помогите с Random

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Помогите с Random

Сообщение ausar 05 сен 2012, 07:39

Привет всем. Пытаюсь сделать так чтобы уровни в игре шли в произваольном порядке при каждом запуске игры. Разумеется понимаю что рэндом может и 10 раз подряд выдать одно и тоже значение. Поэтому решил при старте игры генерировать список номеров уровней и по нему загружать. Набросал вот такое:

Синтаксис:
Используется javascript
function GenList(){
for (var i = 0; i<=stages.Length-1; i++){ //стандартно переходим от эелемента к элементу
while(pres){ //вот здесь я подумал! а ведь моугт быть и повторяющие значения нужно заставить делать рэндом пока он не выдаст уникальное
var fill=Random.Range(1,10); //ну собственно выдаем значние
    for (var a = 0; a<=stages.Length-1; a++){ //берем его и пробегаем по всему массиву сравнивая его
        if (fill==stages[a]){ //если элемент массива равен только что сгенерированному рэндому то
        cnt++; //ставим отметку что уже есть
        }
    }
    if (cnt==0) pres=false; //а ведь быть то не должно поэтому если cnt=0 то элемент уникален и while можно завершать pres=false и вылетаем из while  
}
stages[i]=fill; //присвевам полученное в муках значение элементу массива
press=true; //врубаем while следующий раз
 



Но цикл уходит в бесконечность унося с собой юньку. Где я не прав?
ausar
UNIт
 
Сообщения: 88
Зарегистрирован: 24 окт 2011, 12:59

Re: Помогите с Random

Сообщение Nicloay 05 сен 2012, 07:51

я так понимаю что cnt инициализируется гдето в другом месте.
вобщем..
сnt++ в цикле постоянно инкрементится вперед, по твоей логике изначально он должен быть -(stages.Length) чтоб к концу итерации он у тебя был равен нулю.
вобщем поменяй вот на эту строчку
if (cnt>0) pres=false
и тогда не будет бесконечного цикла.



В добавок, помоему называется алгоритм кнута, выглядит примерно так, псевдо код
Синтаксис:
Используется csharp
int arrSize=10;
int[] values=new int[arrSize];
for (int i=0;i<arrSize;i++){
     values[i]=i;
}
for (int i=0;i<arrSize;i++){
    int tIndex=Mathf.Random(0,arrSize);
    int tValue=values[tIndex];
    values[tIndex]=values[i];
    values[i]=tValue;
}

 


мог немного напутатть, но смысл понятен, - заполняешь массив 1,2,3,..., после этого делаешь еще один цикл, берешь рандомное значение, и значение в массиве от i и от random меняешь местами, после прохода данного массива у тебя будет массив индексов в разброс.
Последний раз редактировалось Nicloay 05 сен 2012, 08:37, всего редактировалось 3 раз(а).
If you wish to make an apple pie from scratch, you must first invent the universe.(Carl Sagan, Cosmos)
| My Asset Store | coloring book | github | _wiki.unity3d.com | twitter | linkedin |
Аватара пользователя
Nicloay
Адепт
 
Сообщения: 1288
Зарегистрирован: 31 май 2012, 09:27
Откуда: Альпс
  • Сайт

Re: Помогите с Random

Сообщение ausar 05 сен 2012, 08:15

Спасибо большое. Вариант с перестановкой просто шикарен
ausar
UNIт
 
Сообщения: 88
Зарегистрирован: 24 окт 2011, 12:59

Re: Помогите с Random

Сообщение mrcoder 05 сен 2012, 09:17

стандартный корейский рандом вполне ничего.
если ДЕЙСТВИТЕЛЬНО нужно что то большее, то используйте самописный, причем обязательно в сочетании с полным текущим временем в миллисекундах.
Аватара пользователя
mrcoder
Старожил
 
Сообщения: 704
Зарегистрирован: 28 июн 2012, 22:40

Re: Помогите с Random

Сообщение mrcoder 05 сен 2012, 09:18

поищите в инете - примеров самописных хороших генераторов достаточно.
Аватара пользователя
mrcoder
Старожил
 
Сообщения: 704
Зарегистрирован: 28 июн 2012, 22:40

Re: Помогите с Random

Сообщение bojlahg 05 сен 2012, 09:56

Синтаксис:
Используется csharp
private int[] Generate(int levelcount)
        {
                List<int> levelinexes = new List<int>();
                for(int i = 0; i < levelcount; ++i)
                {
                        levelinexes.Insert(Random.Range(0, levelinexes.Count), i);
                }
                return dicelist.ToArray();
        }
Мои проекты: MahJah Star Factory Cop Car Swash! Spline Editor
Аватара пользователя
bojlahg
UNIверсал
 
Сообщения: 392
Зарегистрирован: 13 авг 2011, 10:57
Откуда: Сатка
Skype: bojlahg
  • Сайт


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 23