XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
умный рандом
помнил, да забыл...
Нужен алгоритм, который заполнит случайным образом массив величины N числами от 1 до N так, чтобы ни одно число не повторилось.
Старый 03.05.2011, 07:39
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
define N=100
int array rnd
int array result
int index=0
int number=0
int n=N
whilenot (index>=N)
{    
    rnd[index]=index++
}
index=0
whilenot (index>=N)
{    
    number=GetRandomInt(0,n)
    result[index]=rnd[number]
    rnd[number]=rnd[n--]
    index++
}
Старый 03.05.2011, 11:40
Hanabishi
COOL STATUS
offline
Опыт: отключен
самый лёгкий способ
на jass так примерно:
local integer n = <длина массива>
local integer i = 1
local integer j
local real array a

loop
exitwhen(i>=n)
    set a[i] = GetRandomReal(0,100)
    set j = 1
    loop
    exitwhen(j>=n)
        if a[i]==a[j] then
            set i = i-1
            set j = n
        else
            set j = j+1
        endif
    endloop
    set i = i+1
endloop
Hanabishi добавил:
естественно массив a будет содержать неповторяющиеся значения real от 1 до 100
с integer нужно быть осторожнее, ибо если диапазон рандома будет меньше длинны n, то цикл будет вечен
Старый 03.05.2011, 18:49
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
Hellfim:
Clamp, копетан сообщает, что второй массив нужен, чтоб избежать повторения чисел.
Ваш копетан какой то странный, ведь можно сверять заполняемую ячейку с уже заполненными ячейками этого самого массива, без применения второго, тем самым экономя память и строки кода
Clamp добавил:
int N=10, i=0, j=0, b=0, arr a
loop
{
exitwhen i==N
i++
loop
{
exitwhen b==0
b=0
a[i]=GetRandomInt(1,N)
loop
{
exitwhen j==i-1
j++
if(a[i]==a[j]){
b=1
}
}
}
}
Clamp добавил:
вроде должно работать, проверить сейчас не могу
с телефона, поэтому форматирование корявое
Старый 03.05.2011, 21:47
J64_

offline
Опыт: 4,724
Активность:
int array A,B
int T
void Get(int i){
int n=MAX
loop
    i--
    exitwhen i<0
    n--
    T=GetRandomInt(0,n)
    A[i]=B[T]
    B[T]=B[n]
    B[n]=A[i]
endloop
}
массив B - изначально 0,1,2,3...MAX
надеюсь все верно,ато 4 часа ночи...
акацо скепил ТТ

Отредактировано AdamanTX, 03.05.2011 в 22:14.
Старый 03.05.2011, 22:03
DotaMaster666
Silenced by GadenbIsh
offline
Опыт: 1,259
Активность:
ibrary fx initializer init {

#include "cj_types.j"

    #define N = 10
    
    int arr[]

    nothing init () {
        int i = N, a, b
        do {
            arr[i] = i
        } whilenot (--i < 0)

        i = N
        do {
            a = GetRandomInt(0, N)
            b = arr[i]
            arr[i] = arr[a]
            arr[a] = b
        } whilenot (--i < 0)
    
        i = N
        do {
            BJDebugMsg(I2S(arr[i]))
        } whilenot (--i < 0)
    }
    
}
Нубский вариант, я все-таки поищу нормальный.
Старый 03.05.2011, 23:05
DioD

offline
Опыт: 45,134
Активность:
совершенно необязательно прекешировать результаты...


выбираете случайный слот и ставите переадресацию на последний из возможных, уменьшаете возможный слот на 1.

при выборке такого же числа вы получите данные переадресации.
Старый 04.05.2011, 10:27
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
второй массив сожрет больше памяти в процессе, хотя на инициализацию потратит существенно меньше.
Плюс можно извращаться с исключением из диапазона рандома уже выпавших чисел путем введения второго массива целых чисел, что позволит сократить мгновенные затраты памяти, зато увеличит постоянно затрачиваемую память
Старый 05.05.2011, 08:21
Doc

offline
Опыт: 63,163
Активность:
Хватить обращать внимание на килобайты оперативки.
[+] замечание от Hanabishi: 1.1 (ненормативная лексика)

Отредактировано Hanabishi, 05.05.2011 в 13:24.
Старый 05.05.2011, 08:46
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 20:03.