Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Jackpot


Rekomendowane odpowiedzi

Opublikowano

Witam wróciłem do VB i naszła mnie by zrobić jackpota offline tak tylko by pograc. Mam problem ze znalezieniem kodu losowania liczb z różnymi procentami. Czyli np do puli może wejsc max 5 osób ty i 4 boty boty za pomacą przycisku z randomową kwotą i jest 5 liczb do generowania każda osoba dostaje liczbe 1,2,3,4,5 i wgl potem pula sie sumuje i oblicza procent ile posiada gracz 1,2 itp. I moje pytanie  brzmi jaki jest kody by przypisac jakiejs liczbe szanse na wylosowanie? np 20% jakieś propozycje? Daje like +

Opublikowano

Pseudokod:

wkladGraczy = [] //zainicjowanie tablicy z kwotami poszczególnych graczy
szansaWygranej = [] // zainicjowanie tablicy z szansą wygranej dla każdego gracza

wkladGraczy[1] = 500
wkladGraczy[2] = 1200
...

// oblicza szansę w postaci liczby od 0 do 1 - jak chcesz procenty to pomnóż przez 100
// musisz zadbać o to żeby dzielnik nie wynosił 0
szansaWygranej[1] = wkladGraczy[1] / suma(wkladGraczy)
szansaWygranej[2] = wkladGraczy[2] / suma(wkladGraczy)
...

function suma(tablica)
{
    // zwraca sumę elementów tablicy (być może jest gotowa funkcja)
}

Nie uważało się na matmie ;)

Oczywiście możesz to sobie wrzucić w jakieś pętle, żeby zautomatyzować wyliczenia.

Chcesz precyzyjnej i zrozumiałej odpowiedzi? - Zadaj precyzyjne i zrozumiałe pytanie. Nie przyjmuję zleceń.
Nie odpowiadam na priv na pytania, które można zadać na forum. Chcesz mojej pomocy - oznacz mnie w poście =>  @"Hans Kloss PL" 

Opublikowano

Ogólnie mam już wszystkie szanse wygranej ustalone ale nie mam pojęcia jak zrobić by program je między sobą wylosował. Nie wiem co matma ma z tym wspólnego

Opublikowano

Co ma wspólnego wyliczanie szans z matmą? Masz rację, nic  :makka:

Chcesz precyzyjnej i zrozumiałej odpowiedzi? - Zadaj precyzyjne i zrozumiałe pytanie. Nie przyjmuję zleceń.
Nie odpowiadam na priv na pytania, które można zadać na forum. Chcesz mojej pomocy - oznacz mnie w poście =>  @"Hans Kloss PL" 

Opublikowano

Tylko że nie miałem problemu z wyliczeniem procentu programem a problem z przypisaniem tych procentow do danej osoby :)

Opublikowano

No to teraz podaj mi wzór / algorytm na wyliczenie zwycięzcy to już implementację Ci podam, jak tylko z tym masz problem ;)

Chcesz precyzyjnej i zrozumiałej odpowiedzi? - Zadaj precyzyjne i zrozumiałe pytanie. Nie przyjmuję zleceń.
Nie odpowiadam na priv na pytania, które można zadać na forum. Chcesz mojej pomocy - oznacz mnie w poście =>  @"Hans Kloss PL" 

Opublikowano
  wkladgraczy1 = TextBox1.Text
        wkladgraczy2 = TextBox2.Text
        wkladgraczy = wkladgraczy1 + wkladgraczy2
        szansawygranej1 = (wkladgraczy1 / wkladgraczy) * 100
        szansawygranej2 = (wkladgraczy2 / wkladgraczy) * 100
        Label1.Text = szansawygranej1
        Label2.Text = szansawygranej2
        Dim ah As New Random
        Dim ah1 As New Random
        reszta = 101 - szansawygranej1
        reszta1 = 101 - szansawygranej2
        winner = ah.Next(1, reszta)
        winner1 = ah1.Next(1, reszta1)
        If winner > winner1 Then
            Label4.Text = "G2"
        ElseIf winner < winner1 Then
            Label4.Text = "G1"
        Else
            Button1.PerformClick()

        End If

Wzorowałem się na twoim kodzie bo mój był bardziej skomplikowany ale tera mam problem już tylko z systemem random ale powinienem zaraz ogarnąć

Opublikowano

Mógłbyś mi to opisać abstrakcyjnie? Nie znam składni basica a chciałbym sprawdzić czy dobrze to robisz (albo komentarze chociaż dodaj od 10 linijki). Skąd to 101? Winner odpowiada g1? Po co to liczenie reszty? Prosiłem o wzór, nie implementację - tak się łatwiej dyskutuje.

Chcesz precyzyjnej i zrozumiałej odpowiedzi? - Zadaj precyzyjne i zrozumiałe pytanie. Nie przyjmuję zleceń.
Nie odpowiadam na priv na pytania, które można zadać na forum. Chcesz mojej pomocy - oznacz mnie w poście =>  @"Hans Kloss PL" 

Opublikowano

Reszte chodziło mi o to że ze 100% zostaje tylko % ile ma szans 101 ponieważ gdy jest system random (1, 101) to losuje od 1 do 100 dy by było od (1, 100) to by było od 1 do 99 tam na dole z winner jest zle ponieważ nie wiem jak zrobic zeby wylosowalo zwyciezce moglem jeszcze uproscic ten kod ale zrobie to gdy będę wiedział że system losowania działa dobrze. Mam już ustalone kto ile ma % ale ciężko mi to rozlosować, i nie mam pojęcia jakim kodem mogę to losować

#edit Kod ukończony daje gotowy niżej jeszcze tylko pozostaje mi go skrócić do jak najprostszej formy z moich testów, że program losuje losowo, jeszcze jak ktoś się zna może się wypowiedzieć:

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        wkladgraczy1 = TextBox1.Text
        wkladgraczy2 = TextBox2.Text
        wkladgraczy = wkladgraczy1 + wkladgraczy2
        szansawygranej1 = (wkladgraczy1 / wkladgraczy) * 100
        szansawygranej2 = (wkladgraczy2 / wkladgraczy) * 100
        Label1.Text = szansawygranej1
        Label2.Text = szansawygranej2
      
        reszta = 101 - szansawygranej1
        reszta1 = 101 - szansawygranej2
        winner = ah.Next(1, 101)
        If szansawygranej1 > szansawygranej2 Then
            If winner <= szansawygranej1 Then
                Label4.Text = "G1"
            Else
                Label4.Text = "G2"
            End If

        End If
        If szansawygranej2 > szansawygranej1 Then
            If winner <= szansawygranej2 Then
                Label4.Text = "G2"
            Else
                Label4.Text = "G1"
            End If
        End If
        
     


    End Sub
End Class

Opublikowano

To proste:

 

1. Ustalmy sobie dla prostego rachunku, że wszystkich "losów" jest 100.

2. Każdy gracz dostaje tyle losów ile ma szans wygranej - przydzielejmy losy po kolei:

  • gracz 1 ma powiedzmy 25% szans więc dostaje losy od 1 do 25,
  • gracz 2 ma np 50% szans to dostaje losy od 26 do 75,
  • gracz 3 ma pozostałe 25% szans więc dostaje losy od 76 do 100

3. Zakładając, że metoda .Next() jest porządna i losuje liczby z równym prawdopodobieństwem losujemy nią liczbę od 1 do 100.

4. Który gracz ma przydzieloną dana liczbę ten wygrywa.

 

Teraz spróbuj to zaimplementować.

Chcesz precyzyjnej i zrozumiałej odpowiedzi? - Zadaj precyzyjne i zrozumiałe pytanie. Nie przyjmuję zleceń.
Nie odpowiadam na priv na pytania, które można zadać na forum. Chcesz mojej pomocy - oznacz mnie w poście =>  @"Hans Kloss PL" 

Opublikowano

Będę musiał pokombinować z losami są trudniejsze, ale przy większej ilości graczy jednak będą bardziej przejrzyste i prostsze ale to zrobię jutro dzięki za pomoc

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        wkladgraczy1 = TextBox1.Text
        wkladgraczy2 = TextBox2.Text
        wkladgraczy = wkladgraczy1 + wkladgraczy2
        szansawygranej1 = (wkladgraczy1 / wkladgraczy) * 100
        szansawygranej2 = (wkladgraczy2 / wkladgraczy) * 100
        Label1.Text = szansawygranej1
        Label2.Text = szansawygranej2
        winner = ah.Next(1, 101)
        Label6.Text = wkladgraczy
        If winner < szansawygranej1 Then
            Label4.Text = "g1"
        Else
            Label4.Text = "g2"
        End If
        
     


    End Sub

Kod z losami ale nie jestem w 100% pewny czy jest to "sprawiedliwe losowanie" musiał by się wypowiedzieć ktoś kto już tak próbował 

@edit2 Będę jeszcze musiał coś zrobic bo system losów przy tym losowaniu działa na 2 liczby tera zastanawiam się jak zmieścić tam 3, 4... Ponieważ tak dzieli losy tylko na 2 a jak bedzie dzielic na wiecej to bedzie problem ... Jak ktoś ma jakieś jeszcze propozycje liczę na pomoc daje like +++

Opublikowano

W tej wersji z posta #9, którą podałeś masz niewykorzystane zmienne (reszta, reszta1), poza tym zamiast:

If szansawygranej2 > szansawygranej1 Then

powinno być:

ElseIf szansawygranej2 > szansawygranej1 Then

To bardzo ważne, pamiętaj o tym - w innym przypadku program wykonuje niepotrzebne operacje (sprawdza coś co z góry wiadomo, że jest fałszem).

 

Poza tym jestem niemal pewien, ze zastosowany przez Ciebie algorytm da przypadkowy wynik nie mający wiele wspólnego z wyliczonymi szansami (chyba, że mi to wytłumaczysz bo nie łapię).

 

Edit:

Poprawiony kod w poscie #11 nadal nie spełnia założeń - to nie jest na pewno to co opisałem w poscie #10 - musisz każdemu graczowi najpierw przypisać zakresy liczb, potem w instrukcjach warunkowych sprawdzać w którym zakresie jest wynik i dzięki temu znaleźć zwycięzcę (po przypisaniu zakresów szanse poszczególnych graczy nie są już do niczego potrzebne). Oczywiście nie jest to jedyny sposób, pewnie nieoptymalny obliczeniowo, ale na pewno poprawny i wg mnie bardzo przejrzysty (symuluje tradycyjną loterię).

 

 

@StuSto

Edit2:

Tak naprawdę to żeby nie wykonywać zbędnych operacji to szans nawet nie trzeba wyliczać - wystarczy potraktować bezpośrednio wkłady jako losy (oczywiście szanse nadal można osobno wyliczyć, żeby podnieść atrakcyjność prezentacji).

Chcesz precyzyjnej i zrozumiałej odpowiedzi? - Zadaj precyzyjne i zrozumiałe pytanie. Nie przyjmuję zleceń.
Nie odpowiadam na priv na pytania, które można zadać na forum. Chcesz mojej pomocy - oznacz mnie w poście =>  @"Hans Kloss PL" 

Opublikowano

Tu masz działający przykład w Javascript, powinien Ci pomóc (wklej sobie do konsoli w przeglądarce i wciśnij enter - konsola jest zazwyczaj pod Ctrl+Shift+J):

var players = [], pot, result;

// funkcja oblicza sumę depozytów
// należy przekazać tablicę graczy i liczbę elementów do zsumowania
function calculateSum(players, range)
{
  var sum = 0;
  for(var i = 0; i < range; i++)
  {
    sum += players[i]['deposit'];
  }
  return sum;
}

// główna funkcja losująca zwycięzcę
// zwraca imię zwycięzcy
function runJackpot(players)
{
  var winner;
  pot = calculateSum(players, players.length);
  result = Math.floor(Math.random() * (pot + 1));
  for(var i = 0; i < players.length; i++)
  {
    if(result <= calculateSum(players, i + 1))
    {
      winner = players[i]['name'];
      return winner;
    }
  }
}

// ustawienie danych graczy (liczba graczy może być dowolna):

players[0] = {'name': 'Gracz1', 'deposit': 2500};
players[1] = {'name': 'Gracz2', 'deposit': 720};
players[2] = {'name': 'Gracz3', 'deposit': 50};
players[3] = {'name': 'Gracz4', 'deposit': 310};
players[4] = {'name': 'Gracz5', 'deposit': 1100};

// losowanie:

winner = runJackpot(players);

// prezentacja danych i wyniku (tutaj wyniki są pokazywane w konsoli):

for(var i = 0; i < players.length; i++)
{
  console.log('Imię: ' + players[i]['name'] + ' | Wkład: ' + players[i]['deposit']);
}
console.log('Pula: ' + pot);
console.log('Wylosowany los: ' + result); // tego w finalnym programie lepiej nie pokazywać
console.log('Zwycięzca: ' + winner);

W vb chyba nie ma tablic asocjacyjnych, ale możesz użyć zwykłych tablic albo kolekcji zamiast tego.

 

Wersja w Javascript z użyciem zwykłych tablic (trochę mniej czytelna):

 

 

var players = [], pot, result;

// funkcja oblicza sumę depozytów
// należy przekazać tablicę graczy i liczbę elementów do zsumowania
function calculateSum(players, range)
{
  var sum = 0;
  for(var i = 0; i < range; i++)
  {
    sum += players[i][1];
  }
  return sum;
}

// główna funkcja losująca zwycięzcę
// zwraca imię zwycięzcy
function runJackpot(players)
{
  var winner;
  pot = calculateSum(players, players.length);
  result = Math.floor(Math.random() * (pot + 1));
  for(var i = 0; i < players.length; i++)
  {
    if(result <= calculateSum(players, i + 1))
    {
      winner = players[i][0];
      return winner;
    }
  }
}

// ustawienie danych graczy (liczba graczy może być dowolna):

players[0] = ['Gracz1', 2500];
players[1] = ['Gracz2', 720];
players[2] = ['Gracz3', 50];
players[3] = ['Gracz4', 310];
players[4] = ['Gracz5', 1100];

// losowanie:

winner = runJackpot(players);

// prezentacja danych i wyniku (tutaj wyniki są pokazywane w konsoli):

for(var i = 0; i < players.length; i++)
{
  console.log('Imię: ' + players[i][0] + ' | Wkład: ' + players[i][1]);
}
console.log('Pula: ' + pot);
console.log('Wylosowany los: ' + result); // tego w finalnym programie lepiej nie pokazywać
console.log('Zwycięzca: ' + winner);

 

 

 

Edit:

Sprawdziłem na próbie 1 000, 10 000 i 100 000 losowań - im większa ilość losowań tym procent wygranych danego gracza zbliża się do jego szans (przy 100 000 prób się praktycznie pokrywa), wiec skrypt działa całkowicie prawidłowo.

Chcesz precyzyjnej i zrozumiałej odpowiedzi? - Zadaj precyzyjne i zrozumiałe pytanie. Nie przyjmuję zleceń.
Nie odpowiadam na priv na pytania, które można zadać na forum. Chcesz mojej pomocy - oznacz mnie w poście =>  @"Hans Kloss PL" 

Opublikowano

Wszystko spoko tylko ktoś musiałby rzucić kodem który losuje zwycięzne ponieważ mi się zdaje, że  w VB nie będzie to takie prostę

Opublikowano

Nie widzę powodu, dla którego miałoby być to w vb trudniejsze. Jestem niemal pewien, że da się to przepisać na vb prawie 1:1 (ten drugi przykład). Nie użyłem konstrukcji, które nie miałyby swoich odpowiedników w vb.

Chcesz precyzyjnej i zrozumiałej odpowiedzi? - Zadaj precyzyjne i zrozumiałe pytanie. Nie przyjmuję zleceń.
Nie odpowiadam na priv na pytania, które można zadać na forum. Chcesz mojej pomocy - oznacz mnie w poście =>  @"Hans Kloss PL" 

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...