Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

[ROZWIĄZANE] Losowanie bez powtórzeń


  • Zamknięty Temat jest zamknięty
15 odpowiedzi w tym temacie

#1 szelbi

    Hero

  • Power User

Reputacja: 373
Wszechpomocny

  • Postów:1 032
  • Steam:steam
  • Imię:Norbert
  • Lokalizacja:Częstochowa
Offline

Napisano 26.10.2013 16:23

Szukam sposobu na utworzenie funkcji, która losowałaby bez powtórzeń, czyli:

 

Pierwsze losowanie wśród liczb od 1 do 10 - wylosowało 5

Drugie losowanie wśród liczb od 1 do 10 (nie bierze pod uwagę 5) - wylosowało 2

Trzecie losowanie wśród liczb od 1 do 10 (nie bierze pod uwagę 5 i 2) - wylosowało 7

itd.

 

Oczywiście ze zmianą mapy wszystko się resetuje.

 

Z góry dzięki za pomoc ;)


  • +
  • -
  • 0

#2 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 981
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 26.10.2013 16:44

Zrób tablice dynamiczną , wrzuć do niej liczby , potem losuj index ( od 0 do rozmiar -1 ), pobieraj liczbe z indexu , usuwaj pole z tablicy pod danym indexem


  • +
  • -
  • 2

#3 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 26.10.2013 16:47

Zrób tablicę, która ma elementów tyle co maksymalna liczba do wylosowania i tam zapisuj prawdę na pozycji x, gdy wylosuje się x, a potem tylko będziesz losować dotąd, aż nie wylosuje się jakaś wartość, która ma fałsz w tamtej tablicy. Jest to sposób mniej optymalny, ale łatwiejszy do zrobienia. Drugi sposób, to także zrobić tablicę, ale jeśli wylosujemy x, to w tablicy tam gdzie jest indeks x, wrzucamy ostatnią wartość z tej tablicy i zmniejszam ilość do wylosowania. Trochę ciężko to szybko opisać, ale może coś Ci to rozjaśni, być może ktoś Ci tu rzuci też jakimś kodem.
sebul (26.10.2013 16:48):
A no właśnie, dynamiczna tablica będzie tutaj najlepszym rozwiązaniem, bo nie trzeba niczego przenosić.

  • +
  • -
  • 1

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#4 szelbi

    Hero

  • Autor tematu
  • Power User

Reputacja: 373
Wszechpomocny

  • Postów:1 032
  • Steam:steam
  • Imię:Norbert
  • Lokalizacja:Częstochowa
Offline

Napisano 26.10.2013 17:48

Może ktoś sypnąć kodem? Bo nie bardzo rozumiem jak to wykonać ;)


  • +
  • -
  • 0

#5 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 27.10.2013 11:51

new liczby[] = {
1,2,3,4,5,6,7,8,9,0
};
new i, j, r, s = sizeof(liczby), Array:ah = ArrayCreate(1, 10);

for(i=0; i<s; ++i)
ArrayPushCell(ah, liczby[i]);

for(i=0; i<(j=ArraySize(ah)); ++i) {
log_amx("%i", ArrayGetCell(ah, (r = random(j))));
ArrayDeleteItem(ah, r);
}

Nie testowane.
  • +
  • -
  • 1

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#6 szelbi

    Hero

  • Autor tematu
  • Power User

Reputacja: 373
Wszechpomocny

  • Postów:1 032
  • Steam:steam
  • Imię:Norbert
  • Lokalizacja:Częstochowa
Offline

Napisano 27.10.2013 12:43

new model_zh[10];
new modele[] = {
	"zh_corpse",
	"zh_crispy2",
	"zh_classic",
	"zombie_big_origin",
	"zombie_girl",
	"zombie_leech",
	"zombie_nemesis",
	"zombie_poison",
	"zombie_resident",
	"zombie_speed"
};
public LosujModele()
{
	new i, j, r, s = sizeof(modele), Array:ah = ArrayCreate(1, 10);

	for(i=0; i<s; ++i)
	ArrayPushString(ah, modele[i]);

	for(i=0; i<(j=ArraySize(ah)); ++i)
	{
		r = random(j);
		ArrayGetString(ah, r, model_zh[r], 31);
		ArrayDeleteItem(ah, r);
	}
}
L 10/27/2013 - 12:33:18: Info (map "de_dust2") (file "addons/amxmodx/logs/error_20131027.log")
L 10/27/2013 - 12:33:18: [AMXX] Displaying debug trace (plugin "zombiehell_v1.6.amxx")
L 10/27/2013 - 12:33:18: [AMXX] Run time error 4: index out of bounds 
L 10/27/2013 - 12:33:18: [AMXX]    [0] zombiehell_v1.6.sma::LosujModele (line 628)
L 10/27/2013 - 12:33:18: [AMXX]    [1] zombiehell_v1.6.sma::plugin_init (line 223)

  • +
  • -
  • 0

#7 Gość_21977_*

  • Gość

Reputacja: 0

Offline

Napisano 27.10.2013 13:38

W funkcji ArrayCreate (620) jako pierwszy parametr (maksymalna wielkość danych, w Twoim wypadku długość stringa) podajesz 1, podczas, gdy stringi z tablicy są dłuższe, niż 1 i to powoduje błąd.

 

Pomijając już kwestię inicjacji tablicy dynamicznej o za małym rozmiarze, zastanów się, jaki warunek zostanie wykonany przy szóstej iteracji pętli z linijki 625. i dlaczego nie zostanie on spełniony.



#8 szelbi

    Hero

  • Autor tematu
  • Power User

Reputacja: 373
Wszechpomocny

  • Postów:1 032
  • Steam:steam
  • Imię:Norbert
  • Lokalizacja:Częstochowa
Offline

Napisano 27.10.2013 14:12

Zmieniłem wielkość na 20 i pobieram wielkość tablicy i dodaję jeden (inaczej nie wylosowałoby 10. pozycji) przy każdym wywołaniu pętli. Wydaje mi się, że o to chodziło.

public LosujModele()
{
	new i, r, s = sizeof(modele), Array:ah = ArrayCreate(20, 10);

	for(i=0; i<s; ++i)
	ArrayPushString(ah, modele[i]);

	for(i=0; i<ArraySize(ah); ++i)
	{
		r = random(ArraySize(ah)+1);
		ArrayGetString(ah, r, model_zh[random(10)], 20);
		ArrayDeleteItem(ah, r);
	}
}

Nadal występuje ten sam błąd co wcześniej, w związku z czym modele się nie zmieniają, tylko są domyślne.


  • +
  • -
  • 0

#9 Gość_21977_*

  • Gość

Reputacja: 0

Offline

Napisano 27.10.2013 14:22

  1. Usuń +1 (pierwsze id=0).
  2. random(11) zamień na i, inaczej wstawisz losowy model w losowe miejsce.
  3. while(ArraySize(ah)) wystarczy (625).


#10 szelbi

    Hero

  • Autor tematu
  • Power User

Reputacja: 373
Wszechpomocny

  • Postów:1 032
  • Steam:steam
  • Imię:Norbert
  • Lokalizacja:Częstochowa
Offline

Napisano 27.10.2013 14:38

Teraz kod wygląda w ten sposób:

public LosujModele()
{
	new i, r, s = sizeof(modele), Array:ah = ArrayCreate(20, 10);

	for(i=0; i<s; ++i)
	ArrayPushString(ah, modele[i]);

	while(ArraySize(ah))
	{
		r = random(ArraySize(ah));
		ArrayGetString(ah, r, model_zh[r], 20);
		ArrayDeleteItem(ah, r);
	}
}

Błąd już nie występuje, ale modele nadal są ustawione na domyślne, zamiast na Zombie.


  • +
  • -
  • 0

#11 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 27.10.2013 15:30

new model_zh[10][21];
new modele[][] = {
"zh_corpse",
"zh_crispy2",
"zh_classic",
"zombie_big_origin",
"zombie_girl",
"zombie_leech",
"zombie_nemesis",
"zombie_poison",
"zombie_resident",
"zombie_speed"
};
public LosujModele()
{
new i, j, r, s = sizeof(modele), Array:ah = ArrayCreate(20, 10);

for(i=0; i<s; ++i)
ArrayPushString(ah, modele[i]);

while((j = ArraySize(ah)))
{
r = random(j);
ArrayGetString(ah, r, model_zh[r], 20);
ArrayDeleteItem(ah, r);
}
}

I takie uwagi:
1. Pobieraj tylko raz wielkość tablicy dynamicznej.
2. Źle tworzyłeś na początku zmienne.
  • +
  • -
  • 2

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#12 szelbi

    Hero

  • Autor tematu
  • Power User

Reputacja: 373
Wszechpomocny

  • Postów:1 032
  • Steam:steam
  • Imię:Norbert
  • Lokalizacja:Częstochowa
Offline

Napisano 28.10.2013 16:53

OK. Trochę pozmieniałem, żeby było mi wygodniej, lecz model nadal się nie zmienia.

new Array:ah;
new modele[] = {
	"zh_corpse",
	"zh_crispy2",
	"zh_classic",
	"zombie_big_origin",
	"zombie_girl",
	"zombie_leech",
	"zombie_nemesis",
	"zombie_poison",
	"zombie_resident",
	"zombie_speed"
};
public plugin_init() 
{
	(...)
	
	ah = ArrayCreate(21, 10)
	WczytajModele()
}
public WczytajModele()
{
	new s = sizeof(modele);
	
	for(new i=0;i<s; ++i)
	ArrayPushString(ah, modele[i]);
}

public UstawModel() // Jest wykonywana co rundę
{
	new model[21], j, r;
	
	if(!(j = ArraySize(ah)))
	WczytajModele();	

	r = random(j);
	ArrayGetString(ah, r, model, 20);
	ArrayDeleteItem(ah, r);
	
	for(new i=1;i<33; i++)
	{
		if(is_user_connected(i) && get_user_team(i) == 1)
		cs_set_player_model(i, model);
	}
}

  • +
  • -
  • 0

#13 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 28.10.2013 17:14

I dalej swoje...
new modele[][] = {

Tak masz tworzyć tablicę.
  • +
  • -
  • 1

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#14 szelbi

    Hero

  • Autor tematu
  • Power User

Reputacja: 373
Wszechpomocny

  • Postów:1 032
  • Steam:steam
  • Imię:Norbert
  • Lokalizacja:Częstochowa
Offline

Napisano 28.10.2013 18:51

Dobra, moja wina. Zmianę w 1. tablicy zauważyłem, ale w drugiej już nie ;)

Wysłane z mojego HTC Desire S przy użyciu Tapatalk 4
  • +
  • -
  • 0

#15 szelbi

    Hero

  • Autor tematu
  • Power User

Reputacja: 373
Wszechpomocny

  • Postów:1 032
  • Steam:steam
  • Imię:Norbert
  • Lokalizacja:Częstochowa
Offline

Napisano 29.10.2013 16:04

Wszystko działa. Do zamknięcia.


  • +
  • -
  • 0

#16 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 29.10.2013 16:10

Wiadomość wygenerowana automatycznie


Ten temat został zamknięty przez moderatora.

Powód: Pomoc udzielona

Jeśli się z tym nie zgadzasz, report.png raportuj ten post, a moderator lub administrator rozpatrzy go ponownie.


Z pozdrowieniami,
Zespół AMXX.PL
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo





Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych