←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Szanse na wylosowanie czegoś w procentach

  • +
  • -
faken - zdjęcie faken 18.12.2012

Witam szukam kodu , który pokaze mi to co w temacie, załóżmy ze np, mamy 20% szans na wylosowanie granata HE i proszę abyście taki kod mi podali reszte sam zrozumiem.
Odpowiedz

  • +
  • -
speedkill - zdjęcie speedkill 18.12.2012

http://amxx.pl/dokum...cja/f359/random

Następnie w warunku, sprawdzasz czy random(liczba) == 0, jeżeli tak daj graczowi granat ;)
Odpowiedz

  • +
  • -
faken - zdjęcie faken 18.12.2012

Mówiłem że proszę o przykładowy kodzik :P
Odpowiedz

  • +
  • -
Krytykiewicz - zdjęcie Krytykiewicz 18.12.2012

http://amxx.pl/dokum...cja/f359/random

Następnie w warunku, sprawdzasz czy random(liczba) == 0, jeżeli tak daj graczowi granat ;)


A można też zrobić case 1..20, case 21..50, prawda?
Użytkownik Krytykiewicz edytował ten post 18.12.2012 19:47
Odpowiedz

  • +
  • -
speedkill - zdjęcie speedkill 18.12.2012

Tak na szybko:
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>

#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "Administrator"

public plugin_init(){
    register_plugin(PLUGIN, VERSION, AUTHOR);
    register_clcmd("say /test", "GiveHe");
}
public GiveHe(id){
    if(is_user_alive(id) && random(5) == 0){
        //Daj granat
    }
}
Odpowiedz

  • +
  • -
faken - zdjęcie faken 18.12.2012

teraz mi powiedz te procenty w randomach bo nie zabardzo rozumiem
Edit: a czym może być tak if(random_num(1,100)<=20) ( 20% szans na wylosowanie ) ??
Użytkownik fakeN edytował ten post 18.12.2012 20:06
Odpowiedz

  • +
  • -
Droso - zdjęcie Droso 18.12.2012

Z matematycznego punktu widzenia tak, zakres 20 liczb ze 100 to 20%, ale nie wiem po co tak się męczyć i losować większe liczby jak można mniejsze i to samo będzie.

@edit
Wyjaśnienie kodu speedkill
		if(is_user_alive(id) && random(4) == 0){
				//Daj granat
		}
random(4) - czyli losuje 4 liczb (0, 1, 2, 3), więc 1/4 - 25%


@edit czyli speedkillu ty też dałeś błędny kod, bo chciał 20% :D, a ja tobie zaufałem :P
Sorry za błąd, ale zawsze uzywam random_num'a ;D

@edit2 spoko :D
speedkill (18.12.2012 20:58):
Jesteś pewny, że 20% ?

Opis: Zwraca pseudo-losową liczbę całkowitą z przedziału od 0 do max-1.

speedkill (18.12.2012 21:08):
Gość chciał przykładowy kod, więc go dałem ;)

Btw. poprawione.

Użytkownik HubertTM edytował ten post 19.12.2012 15:19
Odpowiedz

  • +
  • -
faken - zdjęcie faken 18.12.2012

a jak żeby wylosowało raz na runde.
Odpowiedz

  • +
  • -
Filip1512 - zdjęcie Filip1512 18.12.2012

Ja bym na poczatku stworzył zmienną bool:

new bool: ma_losowac[33]


Później w plugin_init zarejestrować zdarzenie początku rundy

register_logevent("PoczatekRundy", 2, "1=Round_Start")


Następnie public, moim zdaniem lepiej z taskiem na parę sekund:

public PoczatekRundy(){
ma_losowac[id] = true;
set_task(3.0, "losowanie", id)
}


I funkcja do losowania:

public losowanie(id){
if(is_user_alive(id) && ma_losowac[id] == true){
if(random(5) == 0){
give_item(id, "weapon_hegrenade")
ma_losowac[id] = false
}
}
}


Standardowo mogłem oczywiście(a pewnie to zrobiłem) coś pokiełbasić. W sumie nie wiem, czy w ogóle trzeba do tego robić zmienną, bo początek rundy jest tylko raz w każdej rundzie.
Użytkownik `NN edytował ten post 18.12.2012 22:29
Odpowiedz

  • +
  • -
Krytykiewicz - zdjęcie Krytykiewicz 18.12.2012

public losowanie(id){
if(ma_losowac[id] && is_user_alive(id)){
if(random(5) == 0){
give_item(id, "weapon_hegrenade")
ma_losowac[id] = false
}
}
}


według mnie tak to powinno być. Nie trzeba sprawdzać czy true, wystarczy "!" lub bez. Natomiast lepiej będzie najpierw sprawdzić czy losował aniżeli wysyłać najpierw sprawdzenie do Metamoda:P czy on żyje. Benio na to zwracał uwagę w poradniku.
Odpowiedz

Gość_21977_* 19.12.2012

O, widzę, że mój poradnik jednak się komuś przydał :)

btw. Dla n=0 nie wywołujemy kodu w ogóle, dla n=100 zawsze, ∀n∈ℕ∩[2;99] warunek powinien przyjąć postać
if(random(100/NWD(n, 100))<n/(NWD(n, 100)))
Dla n=1 zaś wykonamy
if(!random(n))
Odpowiedz