Форум Pawn.Wiki - Воплоти мечту в реальность!: Использование Функции Random() - Форум Pawn.Wiki - Воплоти мечту в реальность!

Перейти к содержимому

  • (3 Страниц) +
  • 1
  • 2
  • 3
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ Урок ]
Использование Функции Random()
Оценка: -----

#1
Пользователь офлайн   Romzes 

  • ( ^_^ )
  • Вставить ник
  • Раскрыть информацию
Привет.
В этом уроке мы рассмотрим функцию random().
Начнем.

1. Предисловие.
Для начала мы должны понять для чего предназначена данная функция. Random в переводе с английского — случайный. Следовательно, данная функция возвращает нам случайное значение.
2. Как работает?
Информация в данном пункте чисто для расширения Вашего кругозора.
Числа получаемые с помощью данной функции псевдо случайны, и вычисляются на основе формулы с некоторым начальным значением, которое может быть как функция времени.
Подробнее о алгоритме генератора случайным чисел Вы можете познакомиться здесь.
Также одним из алгоритмов генератора случайных чисел является линейный конгруэнтный метод
3. Как применять данную функцию?
Рассмотрим несколько примеров:
1) Создадим команду, которая выводит случайное число от 1 до 10 (включая 1 и 10).
if(strcmp("/random", cmdtext, true, 10) == 0)
{
	new string[64]; // создаем строку, которая выведется на экран.
	format(string, sizeof(string), "Случайное число: %d", random(10) + 1); /* заполняем строку. Немного объясню как все выполняется. Функция random() ведет отсчет от нуля. Т.е. random(10) вывело бы число от 0 до 9. Следовательно, мы прибавили единицу, чтобы строка заполнилась числом от 1 до 10. */
	SendClientMessage(playerid, 0xFFFFFF, string); // выводим сообщение пользователю
	return 1;
}

На основе этого примера можно сделать азартные игры (например бросание костей, блек-джек и многое другое).
2) Рассмотрим другой пример. Сделаем рэндомный телепорт (сейчас много тем про это):
if (strcmp("/randomtp", cmdtext, true, 10) == 0)
{
	switch(random(4)) // генерируем число от 0 до 3 (включая)
	{
		case 0: SetPlayerPos(playerid, X1, Y1, Z1); // телепортируем игрока в координаты X1, Y1, Z1
		case 1: SetPlayerPos(playerid, X2, Y2, Z2); // ...
		case 2: SetPlayerPos(playerid, X3, Y3, Z3); // ...
		case 3: SetPlayerPos(playerid, X4, Y4, Z4); /* аналогично. Внимание: это не действущие координаты, вы должны заменить их на свои */
	}
	return 1;
}

На основе этого примера можно сделать, например, телепорт в рэндомную камеру при аресте, рэндомный спавн или телепорт на рэндомную ДМ-зону.
И еще, если вы используете более 10 разных координат для телепортов лучше всего использовать массив. Например рэндомный спавн из grandlarc'a :
new Float: gRandomPos[][4] =
{
	{1751.1097, -2106.4529, 13.5469, 183.1979},  // El-Corona - Outside random house
	{2652.6418, -1989.9175, 13.9988, 182.7107},  // Random house in willowfield - near playa de seville and stadium
	{2489.5225, -1957.9258, 13.5881, 2.3440},  // Hotel in willowfield - near cluckin bell
	{2689.5203, -1695.9354, 10.0517, 39.5312},  // Outside stadium - lots of cars
	{2770.5393, -1628.3069, 12.1775, 4.9637},  // South in east beach - north of stadium - carparks nearby
	{2807.9282, -1176.8883, 25.3805, 173.6018},  // North in east beach - near apartments
	{2552.5417, -958.0850, 82.6345, 280.2542},  // Random house north of Las Colinas
	{2232.1309, -1159.5679, 25.8906, 103.2939},  // Jefferson motel
	{2388.1003, -1279.8933, 25.1291, 94.3321},  // House south of pig pen
	{2481.1885, -1536.7186, 24.1467, 273.4944},  // East LS - near clucking bell and car wash
	{2495.0720, -1687.5278, 13.5150, 359.6696},  // Outside CJ's house - lots of cars nearby
	{2306.8252, -1675.4340, 13.9221, 2.6271},  // House in ganton - lots of cars nearby
	{2191.8403, -1455.8251, 25.5391, 267.9925},  // House in south jefferson - lots of cars nearby
	{1830.1359, -1092.1849, 23.8656, 94.0113},  // Mulholland intersection carpark
	{2015.3630, -1717.2535, 13.5547, 93.3655},  // Idlewood house
	{1654.7091, -1656.8516, 22.5156, 177.9729},  // Right next to PD
	{1219.0851, -1812.8058, 16.5938, 190.0045},  // Conference Center
	{1508.6849, -1059.0846, 25.0625, 1.8058},  // Across the street of BANK - lots of cars in intersection carpark
	{1421.0819, -885.3383, 50.6531, 3.6516},  // Outside house in vinewood
	{1133.8237, -1272.1558, 13.5469, 192.4113},  // Near hospital
	{1235.2196, -1608.6111, 13.5469, 181.2655},  // Backalley west of mainstreet
	{590.4648, -1252.2269, 18.2116, 25.0473},  // Outside "BAnk of San Andreas"
	{842.5260, -1007.7679, 28.4185, 213.9953},  // North of Graveyard
	{911.9332, -1232.6490, 16.9766, 5.2999},  // LS Film Studio
	{477.6021, -1496.6207, 20.4345, 266.9252},  // Rodeo Place
	{255.4621, -1366.3256, 53.1094, 312.0852},  // Outside propery in richman
	{281.5446, -1261.4562, 73.9319, 305.0017},  // Another richman property
	{790.1918, -839.8533, 60.6328, 191.9514},  // Mulholland house
	{1299.1859, -801.4249, 84.1406, 269.5274},  // Maddoggs
	{1240.3170, -2036.6886, 59.9575, 276.4659},  // Verdant Bluffs
	{2215.5181, -2627.8174, 13.5469, 273.7786},  // Ocean docks 1
	{2509.4346, -2637.6543, 13.6453, 358.3565} // Ocean Docks spawn 2
};

public OnPlayerSpawn(playerid)
{
	new rand_spawn = random(sizeof(gRandomPos));

	SetPlayerPos(playerid, gRandomPos[rand_spawn][0], gRandomPos[rand_spawn][1], gRandomPos[rand_spawn][2]);
	SetPlayerFacingAngle(playerid, gRandomPos[rand_spawn][3]);
	return 1;
}

3) Сделаем совсем 'безобидную' функцию с помощью рэндома. Каждую секунду цвет машины в которой сидит игрок будет меняться.
Добавляем к глобальным переменным:
new changecolortimer;

Далее:
public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
	KillTimer(changecolortimer);
	changecolortimer = SetTimerEx("changecolor",1000,1,"i",vehicleid);
	return 1;
}

И добавляем фунцию смены цвета с нашим рэндомом:
forward changecolor(i);
public changecolor(i)
{
	ChangeVehicleColor(i, random(120), random(120)); // меняет color1 и color2 на случайные цвета от 0 до 120 
	return 1;
}


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

4. Заключение.

Вот и подошел мой 'урок' к концу. Я думаю, Вы уже сделали вывод, что без данной функции многого было бы 'трудновато' осуществить.
Спасибо за внимание, автор урока - manok.
16

#2
Пользователь офлайн   Skau 

  • Прохожий
  • Вставить ник
  • Раскрыть информацию
большое спасибо
0

#3
Пользователь офлайн   Vyacheslav 

  • Banned
  • Вставить ник
  • Раскрыть информацию
поставил + :rolleyes:

#4
Пользователь офлайн   -=sergey=- 

  • Местный
  • Вставить ник
  • Раскрыть информацию
норм.

#5
Пользователь офлайн   f1tf1t 

  • Прохожий
  • Вставить ник
  • Раскрыть информацию
[quote name='Romzes' timestamp='1317497870' post='2107']
1) Создадим команду, которая выводит случайное число от 1 до 10 (включая 1 и 10).

А например случайные числа будут от 1 до 100, а как сделать чтобы числа были по 10 до 100, то есть случайные числа 10,20,30...50...100?
0

#6
Пользователь офлайн   Romzes 

  • ( ^_^ )
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияf1tf1t (10 июля 2013 - 00:18) писал:

А например случайные числа будут от 1 до 100, а как сделать чтобы числа были по 10 до 100, то есть случайные числа 10,20,30...50...100?


Если я тебя правильно понял тебе нужно вот это: https://pawn.wiki/in...3611-random-ex/
0

#7
Пользователь офлайн   Patrick Jane 

  • Вернусь 1 Июня 2014 Года
  • Вставить ник
  • Раскрыть информацию
Я не до конца понял, как сделать рандомный спавн.
1

#8
Пользователь офлайн   iRusel 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию
Patrick Jane,
new Float:RandomSpawns[][] = 
{ 
{X,Y,Z}, 
{X,Y,Z},
{X,Y,Z}
};

SetPlayerPos(playerid, RandomSpawns[Random][0], RandomSpawns[Random][1], RandomSpawns[Random][2]); 


Ну как-то так.
0

#9
Пользователь офлайн   Patrick Jane 

  • Вернусь 1 Июня 2014 Года
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияiRusel (14 июля 2013 - 07:32) писал:

Patrick Jane,
new Float:RandomSpawns[][] = 
{ 
{X,Y,Z}, 
{X,Y,Z},
{X,Y,Z}
};

SetPlayerPos(playerid, RandomSpawns[Random][0], RandomSpawns[Random][1], RandomSpawns[Random][2]); 


Ну как-то так.

Спасибо.
Но вот:
C:\Users\user\Desktop\new.pwn(145) : error 017: undefined symbol "Random"
Pawn compiler 3.2.3664	 	 	Copyright © 1997-2006, ITB CompuPhase


1 Error.

исправил, но он не работает, а то есть, я появляюсь в мире без текстур.

Сообщение отредактировал Patrick Jane: 14 июля 2013 - 08:00

0

#10
Пользователь офлайн   iRusel 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию
Попробуй.
new Random = random(sizeof(RandomSpawns)); 
SetPlayerPos(playerid, RandomSpawns[Random][0], RandomSpawns[Random][1], RandomSpawns[Random][2]); 

1

Поделиться темой:


  • (3 Страниц) +
  • 1
  • 2
  • 3
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика