Рандомные числа без повторения

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
Привет народ, подскажите решение.
Дано: Массив размером 64 Нужно заполнить массив так что бы в массиве не было повторяющих целых чисел.
Массив уже про индексирован и имеет каждое число под индексом 0.

P.s. Такое вообще возможно или над мной угарает преподаватель?
 

xstage

🏹
Сообщения
726
Реакции
754
Возможно, в гугле легко можно найти решение.
 

Ganter1234

Участник
Сообщения
1,149
Реакции
667
Для какого языка тебе это надо? На sp могу попробывать)
 

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
Уж не правильно, но спасибо правда. Массив в видео уже заполнен показано а нужно, чтобы массив имеет одинаковые int числа, то есть массив состоит размером из 64 индексов и каждый индекс по дефолту имеет значение 0, и нужно его заполнить так что бы в этом массиве не было повторений целых чисел.
Для какого языка тебе это надо? На sp могу попробывать)
Если можешь покажи пожалуйста
 

xstage

🏹
Сообщения
726
Реакции
754
Уж не правильно, но спасибо правда. Массив в видео уже заполнен показано а нужно, чтобы массив имеет одинаковые int числа, то есть массив состоит размером из 64 индексов и каждый индекс по дефолту имеет значение 0, и нужно его заполнить так что бы в этом массиве не было повторений целых чисел.

Если можешь покажи пожалуйста
C-подобный:
public void OnPluginStart()
{
    int array[64] = {0, 0, ...};
    bool sad = false;
    
    for(int i = 0; i < sizeof(array);)
    {
        sad = false;
        int randNum = GetRandomInt(0, sizeof(array));
        
        for(int x = 0; x < sizeof(array); x++)
        {
            if(randNum == array[x])
            {
                sad = true;
                break;
            }
        }
        
        if(!sad)
        {
            array[i] = randNum;
            i++
        }
    }
    
    PrintArray(array, sizeof(array));
}

stock void PrintArray(const int[] array, const int length)
{
    for(int i = 0; i < length; i++)
    {
        PrintToServer("%d", array[i]);
    }
}
 

Kotya

Участник
Сообщения
15
Реакции
9
C-подобный:
public void OnPluginStart()
{
    RegConsoleCmd("sm_array1", Command_Array1);
}

public Action Command_Array1(int iClient, int iArgs)
{
    int iNumbs[64];
    int i = 0;
    for (i = 0; i < 64; i++)
    {
        PrintToServer("%i) %i", i, iNumbs[i]);
    }
   
    ArrayList iCheck = new ArrayList();

    i = 0;
    while (i < 64)
    {
        iNumbs[i] = GetRandomInt(0, 100);
        if (iCheck.FindValue(iNumbs[i]) == -1)
        {
            iCheck.Push(iNumbs[i]);
            i++
        }
    }
    delete iCheck;

    PrintToServer("");
    PrintToServer("------------------");
    PrintToServer("");

    for (i = 0; i < 64; i++)
    {
        PrintToServer("%i) %i", i, iNumbs[i]);
    }

    return Plugin_Handled;
}
 

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
C-подобный:
public void OnPluginStart()
{
    int array[64] = {0, 0, ...};
    bool sad = false;
   
    for(int i = 0; i < sizeof(array);)
    {
        sad = false;
        int randNum = GetRandomInt(0, sizeof(array));
       
        for(int x = 0; x < sizeof(array); x++)
        {
            if(randNum == array[x])
            {
                sad = true;
                break;
            }
        }
       
        if(!sad)
        {
            array[i] = randNum;
            i++
        }
    }
   
    PrintArray(array, sizeof(array));
}

stock void PrintArray(const int[] array, const int length)
{
    for(int i = 0; i < length; i++)
    {
        PrintToServer("%d", array[i]);
    }
}
Ты проверял? а то мне с утра уже показывать надо хаха
 

DeathScore13

пирожок. пирожочек.
Сообщения
734
Реакции
403
1647111321520.png
1647111340574.png

C-подобный:
#include <sourcemod>

public void OnPluginStart()
{
    int out[64], i = -1, j = -1, buffer;
    while (++i < sizeof(out))
    {
        buffer = GetRandomInt(1, 128);
        while (out[++j])
        {
            if (out[j] == buffer)
            {
                i--;
                j = -1;
                buffer = 0;
                break;
            }
        }
        if (!buffer) continue;
        out[i] = buffer;
        j = -1;
    }
    i = -1;
    while (++i < sizeof(out)) PrintToServer("%i", out[i]);
}

единственный минус - нельзя использовать 0 в GetRandomInt. точнее можно, но он будет постоянно скипаться и никогда не запишется.
протестировал со значениями 1-64, всё гуд
 
Последнее редактирование:

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
Спасибо я попробую но не сейчас извините, время ночь.
Самое главное спасибо а то я долго думал как сделать, а оказываться без доп. буфера это не как 😁
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
Кмк, лучше и проще сделать как в RES сделано случайное воспроизведение треков: с помощью занесения чисел в ArrayList, сортировкой через ArrayList.Sort(Sort_Random, Sort_Integer) и последующим удалением использованных из него с помощью RemoveFromArray()
 
Последнее редактирование:

DeathScore13

пирожок. пирожочек.
Сообщения
734
Реакции
403
давно ли нельзя использовать 0 в GetRandomInt ?
C-подобный:
        if (!buffer) continue;
к тому же ПО УМОЛЧАНИЮ в out всё равно 0, на что среагирует out[j] == buffer.
можно заморочиться и сделать по-другому, но это совершенно другая история
 

DaLLuZZ

Участник
Сообщения
34
Реакции
17
ах да, я всего лишь неправильно Вас понял...
 

DeathScore13

пирожок. пирожочек.
Сообщения
734
Реакции
403
хорошо, сейчас сделаю поддержку нуля в рандоме. уже появилась мысль как это реализовать
Сообщения автоматически склеены:

C-подобный:
#include <sourcemod>

public void OnPluginStart()
{
    int out[64], i = -1, j = -1, buffer;
    while (++i < sizeof(out))
    {
        buffer = GetRandomInt(0, 63);
        while (++j < i)
        {
            if (out[j] == buffer && i != j)
            {
                i--;
                j = -1;
                buffer = 0;
                break;
            }
        }
        if (!buffer && i != j) continue;
        out[i] = buffer;
        j = -1;
    }
    i = -1;
    while (++i < sizeof(out)) PrintToServer("%i", out[i]);
}
тестировал, работает.
 
Последнее редактирование:

xstage

🏹
Сообщения
726
Реакции
754
Кмк, лучше и проще сделать как в RES сделано случайное воспроизведение треков: с помощью занесения чисел в ArrayList, сортировкой через ArrayList.Sort(Sort_Random, Sort_Integer) и последующим удалением использованных из него с помощью RemoveFromArray()
Чем лучше? Новичкам лучше узнать как это работает внутри, чем использовать уже готовые функции. Тем более не во всех ЯП есть подобный функционал и приходится уже думать самому.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
@xstage, проще и быстрее
А чтобы узнать как это работает внутри достаточно зайти на гитхаб и посмотреть исходники соурсмода.
 

xtance

Участник
Сообщения
513
Реакции
743
Однострочник на JS

JavaScript:
console.log(Array.from((fn = (set, rand) => (set.size < 64) ? fn(set, rand, set.add(rand(0,100))) : set)(new Set(), (min, max) => Math.floor(Math.random() * (max - min + 1)) + min)));
 

DENFER

Пишу плагины за два биг тести и картошку фри..
Сообщения
260
Реакции
289
Оставлю свое решение, вполне тривиальное со сложностью O(n) или если быть точным Θ(3n) с учетом создания массива и его заполнения, сложностью вполне можно лавировать, если побаловаться с числом итераций в последнем цикле в рамках самого алгоритма без выделения и заполнения массива.
Но это кардинально может поменяться, если строго придерживаться условию и только заполнять массив, а не использовать уже заполненный.

Массив заполненный неповторяющимися случайными значениями:
int array[64];

// Заполняем массив числами в порядке возрастания от 1 до 64 не включительно,
// 0 индекс не учитываем, т.к. он остается равным 0
for (int i = 1; i < 64; ++i) {
    array[i] = i;
}

// Пробегаемся поэлементно и свапаем с рандомным индексом
for (int i = 0; i < 64; ++i) {
    // Получаем случайный индекс с которым будет осуществляться дальнейший свап
    int randomIndex = GetRandomInt(0, 63);
    // Производим свап элементов
    int temp = array[i];
    array[i] = array[randomIndex];
    array[randomIndex] = temp;
}
 
Последнее редактирование:
Сверху Снизу