PDA

Просмотр полной версии : [Native] random



Osetin
30.03.2013, 21:46
Получение рандомного числа.

Параметры:
(max)
max Диапазон значений (от 0 до этого значения минус один), которые могут быть возвращены.

Возвращает Случайное число в диапазоне от 0 до макс-1.



new Float:RandomSpawn[][4] =
{
// Positions, (X, Y, Z and Facing Angle)
{-2796.9854, 1224.8180, 20.5429, 192.0335},
{-2454.2170, 503.8759, 30.0790, 267.2932},
{-2669.7322, -6.0874, 6.1328, 89.8853}
};
public OnPlayerSpawn(playerid)
{
new rand = random(sizeof(RandomSpawn));

// SetPlayerPos на рандомный позиции с нашего списка
SetPlayerPos(playerid, RandomSpawn[rand][0], RandomSpawn[rand][1],RandomSpawn[rand][2]);

// SetPlayerFacingAngle рандомный угол
SetPlayerFacingAngle(playerid, RandomSpawn[rand][3]);
return 1;
}

Desulaid
10.12.2015, 23:04
У рандома есть некоторые фичи, например, если указать 0, то будут большие цифры и то же самое, если указать отрицательное число. Я это так починил


stock fix__random(max)
{
// если было изначально указано отрицательное число,
if (max < 0)
{
// сделаем число положительные
max = max * -1;
// вернем число на единицу большее,
// чтобы ноль исключить
// и сделаем число отрицательным
return (random(max) + 1) * -1;
}
// в других случаях
// вернем число на единицу большее,
// чтобы ноль исключить
return random(max) + 1;
}
#if defined _ALS_random
#undef random
#else
#define _ALS_random
#endif
#define random fix__random

Daniel_Cortez
11.12.2015, 15:48
У рандома есть некоторые фичи, например, если указать 0, то будут большие цифры и то же самое, если указать отрицательное число. Я это так починил


stock fix__random(max)
{
// если был изначально указан ноль,
// то и вернем ноль
if (max == 0)
return 0;
// если было изначально указано отрицательное число,
if (max < 0)
{
// сделаем число положительные
max = max * -1;
// вернем число на единицу большее,
// чтобы ноль исключить
// и сделаем число отрицательным
return (random(max) + 1) * -1;
}
// в других случаях
// вернем число на единицу большее,
// чтобы ноль исключить
return random(max) + 1;
}
#if defined _ALS_random
#undef random
#else
#define _ALS_random
#endif
#define random fix__random
Это не баг, это фича. Так и было задумано, чтобы при нуле функция возвращала совершенно случайное число от cellmin (-2147483648) до cellmax (2147483647). Это самый простой способ получить случайное число из диапазона всех целочисленных значений (в т.ч. отрицательных), и его не нужно "чинить".

Desulaid
11.12.2015, 15:57
Это не баг, это фича. Так и было задумано, чтобы при нуле функция возаращала совершенно случайное число от cellmin (-2147483648) до cellmax (2147483647). Это самый простой способ получить случайное число из диапазона всех целочисленных значений (в т.ч. отрицательных), и его не нужно "чинить".

Аа, я ну тогда можно убрать минус одно условие ;D

Daniel_Cortez
11.12.2015, 16:34
Аа, я ну тогда можно убрать минус одно условие ;D
Ситуации бывают разные, и указание отрицательных чисел тоже может понадобиться, поэтому не следует вводить других в заблуждение о ненужности какой-либо части стандартного функционала. Вряд ли кто-то станет вызывать random с отрицательным числом неосознанно.

В стандартной библиотеке языка C аналогичная функция rand() вообще не требует аргументов и возвращает случайное число (как random(0) в Pawn), а число из нужного диапазона получается из остатка от деления:

int x = rand() % 42; // Случайное число от 0 до 41.
По аналогии задумана и функция random в Pawn, разве что не нужно самому париться с делением, достаточно лишь указать число, как параметр функции. Если же делить ни на что не нужно - random(0), функция не станет делить на ноль число, полученное из системного таймера.