Funkcja ktora bedzie losowac i wpisywac id w taki sposob

0

Czesc wszystkim, dodaje pewne wydarzenie do mojej gry i mam niesamowity problem,

Uzytkownikow przechowuje w ten sposob
FTUsers[UserID] UserID od 0 do 1500

Co chce ogolnie zrobic?

Dajmy na to ze 300 uzytkownikow spełnia to

Zarejestrował sie, OriginalID == -1 jest domyslna wartoscia i ze jest w grze.(okej to wszystko mi dziala)


 if(FTUsers[UserID].OriginalID == -1 && FTUsers[UserID].Registered && IsUserConnected(UserID))

Tylko teraz przechodze dalej FTStats.Count -> ilość zarejestrowanych, dajmy na to ze jest ich dwoch

czyli vector zwraca mi 0, 1, 2 liczac od zera

po losowaniu
random_shuffle(myVector.begin(), myVector.end());
wychodzi 1, 2, 0 (przykład)

i teraz nadchodzi moj problem, nie wiem jak moge ten vector tutaj
Pamietjamy ze jest to w petli for
FTUsers[UserID].originalID = *it; dziala tylko dla jednego

**Chce otrzymac taki wynik **

FTUsers[0].originalID = 1;
FTUsers[1].originalID = 2;
FTUsers[2].originalID = 0;

Dziekuje za jakiekolwiek wskazówki, oczywiscie ilość graczy bedzie siegac az 300-500-1000 userow.
Cały kod

void FT_RandomUserJoin()
	{
		char message[1024]; memset(message, 0x00, 1024);
		vector<int> myVector;
		for (int i = 0; i < FTStats.Count; i++) {
			myVector.push_back(i);
		}
		sprintf(message, "People Register: %i ", FTStats.Count);
		ConsoleOutput(message);
		random_shuffle(myVector.begin(), myVector.end());
		//FTStats.Count user of register
		for (vector<int>::iterator it = myVector.begin(); it != myVector.end(); ++it)
		{
			for (int UserID = 0; UserID < MAXUSERS; UserID++) {
				if (FTUsers[UserID].OriginalID == -1 && FTUsers[UserID].Registered && IsUserConnected(UserID))
				{
					char finalstr[1024]; memset(finalstr, 0x00, 1024);
					FTUsers[UserID].OriginalID = *it;
					sprintf(finalstr, "Random user JOIN Orignal ID: %i U: %i", FTUsers[UserID].OriginalID, UserID);
					ConsoleOutput(finalstr, LightCyan);
				}
			}
		}
		return;
	}
3

Wytłumacz czemu wypełniasz: for (int i = 0; i < FTStats.Count; i++)
Zaś wstawiasz w pętli: for (int UserID = 0; UserID < MAXUSERS; UserID++)
Czy zawsze od startu masz maksymalną ilość użytkowników?
Czy nigdy taki użytkownik nie może opuścić grę (usunąć akaunt)?

http://forum.4programmers.net/1101404

3

Opis problemu jest strasznie mętny, ale chyba chodzi ci o coś takiego:

std::vector<int> randomPermutation(size_t n)
{
    std::vector<int> r(n)
    std::iota(r.begin(), r.end(), 0);
    random_shuffle(r.begin(), r.end());
    return r;
}

void FT_RandomUserJoin()
    {
        char message[1024]; memset(message, 0x00, 1024);
        sprintf(message, "People Register: %i ", FTStats.Count);
        ConsoleOutput(message);

       auto myVector = randomPermutation(FTStats.Count; i++);
       auto it = myVector.begin();
       for (int UserID = 0; UserID < MAXUSERS && it != myVector.end(); UserID++) {
            if (FTUsers[UserID].OriginalID == -1 && FTUsers[UserID].Registered && IsUserConnected(UserID))
            {
                char finalstr[1024]; memset(finalstr, 0x00, 1024);
                FTUsers[UserID].OriginalID = *it++;
                sprintf(finalstr, "Random user JOIN Orignal ID: %i U: %i", FTUsers[UserID].OriginalID, UserID);
                ConsoleOutput(finalstr, LightCyan);
            }
        }
    }

Przy czym mam wątpliwości czy warunek FTUsers[UserID].OriginalID == -1 ma sens przy tej implementacji.
Szczególnie, że nazwa OriginalID sugeruje coś co nie ma sensu dla tego kodu.

0

@_13th_Dragon:
Wypełniam, by uzyskac liczby od 0 do uzytkowników zarejestrowanych. pozniej zmieniam to na losowe ID i dzieki temu id od 0 do 60 beda tylko dodane do wydarzenia reszte dostanie Wiadomość, ze niestety nie zostali wylosowani.

for (int i = 0; i < FTStats.Count; i++)

Druga petla > for (int UserID = 0; UserID < MAXUSERS; UserID++)
Jesli chce sie odwołac do FTusers[UserID].OriginalID wykonuje te petle, by zamiescic Losowe itemy, niestety to nie dziala...
W sumie dales mi teraz do myslenie ze moglbym to zrobic w ten sposób

for (int UserID = 0; UserID < FTStats.Count; UserID++)

Ale dalej niestety nie wiem jak wstawic randomowe numbery bo tu sa dwa "FOR" wciaz się ucze.

Dziękuje za odpowiedź i pomoc.

2
void FT_RandomUserJoin()
{
	ostringstream oss;
	oss<<"People Register: "<<FTStats.Count<<" ";
	ConsoleOutput(oss.str());
	vector<int> r;
	r.reserve(FTStats.Count);
	for(int UserID=0;UserID<FTStats.Count;++UserID)
	{
        if((FTUsers[UserID].OriginalID==-1)&&(FTUsers[UserID].Registered)&&(IsUserConnected(UserID)))
        {
        	r.push_back(UserID)
        }
    }
    random_shuffle(begin(r),end(r));
    for(int i=0;i<r.size();++i)
	{
		FTUsers[r[i]].OriginalID=i;
		oss.clear();
		oss<<"Random user JOIN Orignal ID: "<<i<<" U: "<<r[i];
        ConsoleOutput(oss.str(),LightCyan);
	}
}
0

@_13th_Dragon:

	```cpp
void FT_RandomUserJoin()
	{
		char message[1024]; memset(message, 0x00, 1024);
		sprintf(message, "FT COUNT: %i", FTStats.Count);
		ConsoleOutput(message, LightCyan);
		vector<int> r;
		r.reserve(FTStats.Count);
		for (int UserID = 0; UserID<FTStats.Count; ++UserID)
		{
			if ((FTUsers[UserID].OriginalID == -1) && (FTUsers[UserID].Registered) && (IsUserConnected(UserID)))
			{
				r.push_back(UserID);
			}
		}
		random_shuffle(r.begin(), r.end());
		for (int i = 0; i<r.size(); ++i)
		{
			FTUsers[r[i]].OriginalID = i;
			sprintf(message, "Random user JOIN Orignal ID: %i", FTUsers[i].OriginalID);
			ConsoleOutput(message, LightCyan);
		}
	}

Dokładnie to zadziałało, dziekuje Panu za pomoc, jesli ma pan paypala prosze o przeslanie na priv wiadomosci, wyśle jakies PLN na obiad :)

Widze rowniez ze zajmuje sie Pan ASM, myślę ze miałbym dla pana płatnych kilka zadań. :)

0

@_13th_Dragon: Niestety zobaczylem ze jednak ikrementuje
Random user JOIN Orignal ID: -1
Random user JOIN Orignal ID: 0
Random user JOIN Orignal ID: 1
czyli nie jest randomowo np tak jakbym chcial czyli: 0 -1 1

0
            FTUsers[/*???*/r[i]/*???*/].OriginalID = i;
            sprintf(message, "Random user JOIN Orignal ID: %i", FTUsers[/*???*/i/*???*/].OriginalID);

1 użytkowników online, w tym zalogowanych: 0, gości: 1