Painting a roulette wheel

An example of how to paint a roulette wheel:

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;

class RouletteDrawTest
{

    public static void main(String args[])
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                final RoulettePanel p = new RoulettePanel();

                Thread thread = new Thread(new Runnable()
                {
                    public void run()
                    {
                        double angle = 0;
                        while (true)
                        {
                            p.setRotationAngle(angle);
                            angle += 0.01;

                            try
                            {
                                Thread.sleep(20);
                            }
                            catch (InterruptedException e)
                            {
                                Thread.currentThread().interrupt();
                                return;
                            }
                        }
                    }
                });
                thread.start();

                f.getContentPane().add(p);
                f.setSize(600, 600);
                f.setVisible(true);
            }
        });
    }
}

class RoulettePanel extends JPanel
{
    private static final int numbers[] = new int[]
    { 0, 32, 15, 19, 4, 21, 2, 25, 17, 34, 6, 27, 13, 36, 11, 30, 8, 23, 10, 5,
        24, 16, 33, 1, 20, 14, 31, 9, 22, 18, 29, 7, 28, 12, 35, 3, 26 };

    private double rotationAngleRad = 0.0;

    public void setRotationAngle(double angleRad)
    {
        this.rotationAngleRad = angleRad;
        repaint();
    }

    public void paintComponent(Graphics gr)
    {
        super.paintComponent(gr);
        Graphics2D g = (Graphics2D) gr;

        int w = getWidth();
        int h = getHeight();

        g.setColor(Color.WHITE);
        g.fillRect(0, 0, w, h);

        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);

        int offsetX = 20;
        int offsetY = 20;
        int diameter = Math.min(w - 2 * offsetX, h - 2 * offsetY);
        int radius = diameter / 2;
        int centerX = offsetX + radius;
        int centerY = offsetY + radius;

        int fontSize = (int) (radius * 0.1);
        Font font = new Font("Serif", Font.BOLD, fontSize);
        g.setFont(font);
        FontMetrics fontMetrics = g.getFontMetrics();
        int fontHeight = fontMetrics.getHeight();

        double angleRadDelta = Math.PI * 2 / numbers.length;
        Path2D segment = createSegment(centerX, centerY, radius - fontHeight,
            radius, -angleRadDelta / 2, angleRadDelta / 2);

        AffineTransform originalAT = g.getTransform();
        for (int i = 0; i < numbers.length; i++)
        {
            double angleRad0 = rotationAngleRad + i * angleRadDelta;

            g.setTransform(originalAT);
            g.rotate(angleRad0, centerX, centerY);

            if (i == 0)
            {
                g.setColor(new Color(0, 192, 0));
            }
            else if ((i & 1) == 1)
            {
                g.setColor(Color.RED);
            }
            else
            {
                g.setColor(Color.DARK_GRAY);
            }

            g.fill(segment);
            String numberString = String.valueOf(numbers[i]);
            int delta = fontMetrics.stringWidth(numberString) / 2;
            g.setColor(Color.WHITE);
            g.drawString(numberString, centerX - delta,
                centerY - radius + fontHeight - fontMetrics.getDescent());
        }
        g.setTransform(originalAT);
    }

    private static Path2D createSegment(int centerX, int centerY,
        int innerRadius, int outerRadius, double angleRad0, double angleRad1)
    {
        Arc2D.Double arcInner =
            new Arc2D.Double(centerX - innerRadius, centerY - innerRadius,
                innerRadius * 2, innerRadius * 2, Math.toDegrees(angleRad0),
                Math.toDegrees(angleRad1 - angleRad0), Arc2D.OPEN);

        Arc2D.Double arcOuter =
            new Arc2D.Double(centerX - outerRadius, centerY - outerRadius,
                outerRadius * 2, outerRadius * 2, Math.toDegrees(angleRad1),
                Math.toDegrees(angleRad0 - angleRad1), Arc2D.OPEN);

        Path2D.Double path = new Path2D.Double();
        path.append(arcInner, true);
        path.append(arcOuter, true);
        path.closePath();

        AffineTransform at =
            AffineTransform.getRotateInstance(-Math.PI / 2, centerX, centerY);
        path.transform(at);

        return path;
    }

}

Nice. Jetzt nochmal die Frage, macht es Sinn auf eine Farbe zu setzen, wenn die andere Farbe x-Mal vorher auftrat :wink:

Die Wahrscheinlichkeit ist immer gleich. Die Wahrscheinlichkeit merkt sich nicht, was vorher alles passiert ist. Also sind die Chancen für rot und schwarz nach 50 Mal schwarz immernoch 50:50 (von der 0 im Roulette mal abgesehen).

Wenn eine bestimmte Farbe unverhältnismäßig häufig auftrat, dann sollte man besser nicht von Gleichverteilten Wahrscheinlichkeiten ausgehen. Vgl. Gezinkter Würfel. Bei Tausendmal Rot in Folge würde ich bei Rot bleiben.

Die Wahrscheinlichkeit für jede beliebige Folge ist immer gleich hoch. Viermal Rot ist genauso Wahrscheinlich wie drei mal Rot in Folge und dann Schwarz. Was viele Durcheinander bringt ist der Umstand das bei 4 Runden, 3 Rot und einmal Schwarz in beliebiger Reihenfolge, 4 mal so häufig vorkommt, wie das Ereignis 4 Mal Rot. Betrachtet man aber Bedingte Wahrscheinlichkeiten, was bei der Frage Sinn macht, da das Ereignis x-Mal vorher eine Bedingung ist, dann bekommt man auch eine passende Erklärung warum eine andere Farbe die selbe Wahrscheinlichkeit hat.

Häh… Wahrscheinlichkeiten? Das malt einfach nur das Rad?!

Eigentlich hatte ich das ganze nur hier gepostet, weil

  • auf Stackoverflow eine ähnliche Frage war
  • ich darauf verlinken können wollte (Ja, GitHub-Gist wäre auch gegangen, aber … das Forum ist eben das Forum :))
  • ich das ganze vor x Jahren mal als Antwort auf eine Frage im „anderen Forum“ gepostet hatte, und NICHT auf das andere Forum verlinken wollte

Aber schön, dass es auf so viel Interesse stößt :slight_smile: (im Gegensatz zu all den anderen Threads, die ich in diesem Bereich schon aufgemacht habe -_- )

Um mal kurz was zu den Wahrscheinlichkeiten zu sagen, was ich durch ausprobieren herausgefunden hab…

Bei PRNG, wie man sie auf dem Handy hat, kann man, nach z. B. 10 oder 20 Durchläufen, auf diejenigen Zahlen setzen, die am seltensten vorkamen.

Bei TRNG, das sind physical (true) random number generators, wie Online-Casino-Betreiber z. B. das Hintergrundrauschen beobachten (kostet 200 Euro?), ist es EGAL, auf welche Zahl man nach so und so vielen Durchläufen setzt.

Aber auch bei TRNG wäre ich mir unsicher, ob man nicht doch auf seltene Zahlen setzen kann/sollte. Ob man es -woauchimmer- darf, ist eine andere Frage?

Und jetzt mal zurück zum Thema: GREAT WORK!!! Ich hoffe, du verbringst Weihnachten und so nicht nur damit, Roulette/ Poker/ wtf. zu spielen. :wink:

Ich wollte damit auch auf einen alten Thread anspielen, ich finde ihn nur leider nicht :slight_smile:

Aber letztendlich kommt meine Überlegung auf das Gleiche raus, was @ionbaitu schreibt: setze ich nach 3* Rot auf Schwarz, setze ich ja eigentlich auf die Wette, dass in 4 Runden mind. 1* schwarz kommt. Gehe ich davon aus, dass die Farben gleich häufig kommen, ist diese Möglichkeit deutlich höher.

[quote=timbeau]dass in 4 Runden mind. 1* schwarz kommt. Gehe ich davon aus, dass die Farben gleich häufig kommen, ist diese Möglichkeit deutlich höher[/quote]Im Prinzip ja, aber 4 ist halt noch keine große Zahl…

bye
TT

Vielleicht ist 26 ja eine große Zahl, c.f. https://en.wikipedia.org/wiki/Gambler’s_fallacy#Monte_Carlo_Casino

Ja, von dem Fall habe ich schon gelesen. Das war ja 0.5^26 = 0,0000000149… wenn man die 0 weglässt. Wahnsinn.

  1. So ein Rad wird bestimmt vom TÜV oder so überprüft. (Zudem steht es unter steter Beobachtung der Mitarbeiter.)
  2. Und ein Casino darf (hierzulande) auch nicht jeder betreiben.
  3. Und Casino-Mitarbeiter werden zunehmend - ACHTUNG: SCHON WIEDER DAS SCHLIMME WORT ZUNEHMEND - psychologisch geschult, Leute mit relativ hohen Verlusten zu betreuen.
  4. Und schließlich sollen meine Beiträge niemanden dazu verleiten, Roulette zu spielen oder irgendeine Strategie anzuwenden.
  5. Es sei denn, es geht um ausziehen oder so. :smiley:
  6. Wenn das Rad allerdings manipuliert ist… dann kann so eine Situation von irgendjemanden ja nur eskalieren… also besser, man ist zu der Zeit nicht an dem Ort…