verstehe aufgabenstellung nicht!

Status
Nicht offen für weitere Antworten.

Amaru

Mitglied
HI Also hier mal die Aufgabenstellung

a) Simulieren Sie das Werfen mit einer fairen1 M¨unze. Schreiben Sie dazu eine Methode
flipCoin(), die 1 und 0 jeweils mit Wahrscheinlichkeit 1/2 zur¨uckliefert.
Benutzen Sie ausschließlich Klassen des Paketes java.lang f¨ur die Implementierung!

b) Stellen Sie sich vor, Sie sind in Besitz einer fairen M¨unze und wollen damit einen
fairen W¨urfel 2 nachbilden. Wie gehen Sie vor? Implementieren Sie dazu eine Methode
rollDie(int faces), die f¨ur einenW¨urfel mit faces Seiten (faces> 0) einen
Wurf simuliert und die gew¨urfelte Augenzahl, die zwischen 1 und faces (inklusive)
liegt, zur¨uckgibt! Rufen Sie aus rollDie() ausschließlich flipCoin() auf!

Hab mir gedacht die methode flipCoin()

Code:
 static int flipCoin(){
	   return (int)Math.random();

so mit math.random zu machen nur
bei der b versteh ich net ganz wie ich da vorgehen soll

Code:
static int rollDie(int faces){
	   
	   int n = flipCoin(faces);  // hier bekomm ich einen fehler, keine ahnung 
                                                  warum ich faces nicht mit flipCoin aufrufen kann
	  
	   return faces;
und halt noch die main
Code:
publich static void main(String[] args){

       int x;
      System.out.println(rollDie(x));

kann mir jemand weiterhelfen?[/code]
 
Hi,

- Math.random() liefert einen Double zurück.
- int i = (int) 0.9; System.out.println(i); //0 wird ausgegeben
- Math.round() liefert gerundete Werte

Code:
static int flipCoin(){ 
      return (int)Math.random();

...
int n = flipCoin(faces)
flipCoin() != flipCoin(int faces)

Gruß,
madboy
 
Also zur A, Math.random() ist immer unter 1, von daher würde deine Methode immer 0 zurückliefern...
vllt so:

public int flipCoin(){
return (int)((Math.random()*100)%2);
}

B weiss ich auch nicht wirklich 😀
 
Code:
public int dice(int max){
	double i = Math.random();
	int result = (int)(i * max)+1;
	return result;
}

EDIT:
if(max > 0) noch vergessen
 
Code:
public int dice(int max){ 
   int dice_throw = 1;
   for(int i = 0; i < max; i++) { 
      dice_throw += flipCoin();
   }
  return dice_throw;
}
Ist allerdings kein fairer Würfel 🙁
 
Code:
public int dice(int max){
	int result = 0;
	for(int i = 0 ; i < max ; i++){
		result += flipCoin();
	}
	return result;
}

ungetestet

EDIT:
noch unfairer 🙂
 
aha, soweit versteh ichs glaub ich aber was muss ich machen, dass er fair ist, was für ne überlegung muss ich anstellen?
 
Code:
public int dice(int max){ 
        int int_result = 0;

        while(int_result < 1 || int_result > max) { //so lange wiederholen bis gültige Zahl rauskommt

            String result = ""; 

            for(int i = 0 ; i < Integer.toBinaryString(max).length() ; i++){ 
               result += String.valueOf(flipCoin()); 
            } 

            int_result = Integer.valueOf(result, 2); //zurückwandeln in dezimalzahl
        }
     return int_result;
}

Idee: baue ein "Bitfeld" und fülle es zufällig mit 1en und 0en.

Sollte eigentlich fair sein, der Würfel.

Gruß,
madboy
 
Es besteht allerdings (wie auch bei madboys Version) die geringe Wahrscheinlichkeit einer Endlosschleife :lol:
Code:
import java.util.BitSet;
import java.util.HashMap;
import java.util.Random;

public class Zufall {

	private static final Random r = new Random();
	private static final int faces = 10;

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
		for (int i = 1; i < faces+1; i++)
			map.put(i, 0);
		for (int i = 0; i < 10000; i++) {
			int key = rollDice(faces);
			map.put(key, map.get(key) + 1);
		}
		for (int i = 1; i < faces+1; i++)
			System.out.println(map.get(i));

	}
	
	public static int flipCoin() {
		return r.nextInt(2);
	}

	public static int rollDice(int faces)
	{
		int number = 0;
		int length = Integer.toBinaryString(faces).length();
		BitSet set = new BitSet(length);
		do{
		for(int i=0;i<length;i++){
			if(flipCoin()==0)
				set.flip(i);
		}
		number = intValue(set);
		}while(number>faces || number<1);
		return number;
	}

	public static int intValue(BitSet bitset) {

		int javaIntLength = 32;

		int i;
		int number = 0;
		for (i = 0; i < javaIntLength; i++) {
			if (bitset.get(i))
				number |= (1 << i);
		}
		return number;
	}
}
 
Dann nimm statt des BitSets ein boolean[].
Die HashMap ist eh nur zum Testen der Ergebnise drin...
Das Random kannst du du durch Math.random ersetzen (auch wenn's das gleiche ist :roll🙂
Aber die Aufgabenstellung ist nicht uninteressant :toll:
 
Vielleicht lehne ich mich jetzt ein bischen weit aus dem Fenster. ???:L
Aber wer nicht wagt der nicht gewinnt! 😀

Ich behaupte jetzt einfach mal:
Leroy auf der Fensterbank hat gesagt.:
Diese Aufgabenstellung ist nicht lösbar! :noe:

Beispiel: Ein Würfel mit drei Seiten.

Die flip-Methode kann nur Wahrscheinlichkeiten von 1/2 liefern.
Das bedeutet, das jede, wie auch immer geartete, Kombination von
flip-Aufrufen nur die Summen der Kehrwerte von 2er-Potenzen generieren kann.

Bei einem 3-seitigen Würfel muß jedoch jeder der Seiten
eine Wahrscheinlichkeit von 1/3 zugeordnet werden.

Nun läßt sich 1/3 nur mit einer unendlichen Summe von
Kehrwerten von 2er-Potenzen bilden.

==> Die (mathematisch) exakte Wahrscheinlichkeit von 1/3
ist durch Werfen endlich vieler Münzen niemals zu erzielen.

Ich finde die Aufgabenstellung allerdings so interessant, das ich
sie mal in einem Matheforum stelle.

Melde mich dann!
 
Leroy42 hat gesagt.:
==> Die (mathematisch) exakte Wahrscheinlichkeit von 1/3
ist durch Werfen von endlich vielen Münzen niemals zu erzielen.
Daran habe ich auch überlegt und vermutlich ist das der Grund warum sowohl madboy als auch ich eine Lösung gepostet haben die eventuell nicht terminiert.
 
Wildcard hat gesagt.:
Daran habe ich auch überlegt und vermutlich ist das der Grund warum sowohl madboy als auch ich eine Lösung gepostet haben die eventuell nicht terminiert.
So weit habe ich gar nicht gedacht (zumindest nicht bewusst). Habe einfach einen "Geistesblitz" verfolgt :wink:

Leroy42 hat gesagt.:
==> Die (mathematisch) exakte Wahrscheinlichkeit von 1/3
ist durch Werfen von endlich vielen Münzen niemals zu erzielen.
Ist es überhaupt möglich, durch ein endlich oft wiederholtes Zufallsexperiment eine mathematisch exakte Wahrscheinlichkeit zu erzielen?
Ich dachte bisher, die Wahrscheinlichkeit wäre nur bei Anzahl Versuche -> unendlich exakt.

Gruß vom wissbegierigen madboy
 
madboy hat gesagt.:
Ist es überhaupt möglich, durch ein endlich oft wiederholtes Zufallsexperiment eine mathematisch exakte Wahrscheinlichkeit zu erzielen?

Genaugenommen natürlich nicht,

Ich wollte nur darauf hinaus, daß sich 1/3 nicht durch eine
endliche Summe von Kehrwerten von 2er-Potenzen darstellen läßt.

P.S. Scheint aber doch eine harte Nuß zu sein, noch keine
Antwort im Mathe-Forum 🙁
 
Leroy42 hat gesagt.:
Genaugenommen natürlich nicht,
Wunderbar, ich dachte schon, mein mathematisches Weltbild muss wieder mal umgekrempelt werden (wäre nicht das erste Mal) :wink:

Leroy42 hat gesagt.:
P.S. Scheint aber doch eine harte Nuß zu sein, noch keine
Antwort im Mathe-Forum
@Amaru: du könntest ja mal den Aufgabensteller löchern. Der/diejenige sollte eigentlich wissen, was sich dahinter verbirgt :bae:
 
Hallo!

ich habe auch eine Idee zur Lösung nur ist irgendwo der Wurm im Sinne einer endlossschleife drin (gibt sicher einen eleganteren Weg aber bin nicht so der Java"pro"): http://phpfi.com/236604
 
Nach einiger Fehlersuche und ein paar Änderungen im Code bin ich nun zu folgendem Schluss gekommen:
 
Es gibt eine Näherungslösung:

Um eine Gleichverteilung zu erzielen, muß eine Zufallszahl
von 1 bis zu der 2er-Potenz gezogen werden, die größer oder
gleich der Anzahl der Würfelseiten ist.

Die eigentlich Ermittlung geschieht dann Über Intervallteilung
des aktuellen Bereichs via flip()

Liefert flip 0 ist das linke, sonst das rechte Teilintervall zu nehmen.

Code:
class DiceByFlip {
	static final Random rand = new Random();
	
	public int flip() {
		return rand.nextInt(2);
	}
	public int dice(int faces) {
		// Bestimme 2er-Potenz >= faces
		int pot=1;
		while (pot < faces) 
			pot *= 2;
		// Zufallszahl aus [1..pot] durch 
		// Intervallteilung bestimmen bis in [1..faces]
		int l,r;
		do {
			l = 0;
			r = pot-1;
			while (l != r)
				if (flip() == 0)
					r = l + (r-l)/2;
				else
					l = l + (r-l)/2 + 1;
		} while (r >= faces);
		return r+1;
	}
}

Hier noch ein kleines Testprogramm:
Code:
import java.awt.*;
import javax.swing.*;
import java.util.*;

class DiceF extends JFrame {
	DiceByFlip dice = new DiceByFlip();
	JButton startStop = new JButton("Start");
	JTextField tf = new JTextField(10);
	JPanel diceP = new DiceP();
	int[] dices;
	
	boolean isRunning;
	boolean stopRun;
	
	public DiceF() {
		JPanel north = new JPanel();
		north.add(new JLabel("Anzahl Würfelseiten:"));
		north.add(tf);
		north.add(startStop);
		add(north, BorderLayout.NORTH);
		add(diceP, BorderLayout.CENTER);
		startStop.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				startStop();
			}});
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(500, 300);
		setLocationRelativeTo(null);
		setVisible(true);
	}
	public void startStop() {
		if (isRunning)
			stopRun = true;
		else {
			isRunning = true;
			stopRun = false;
			startStop.setText(("STOP"));
			new Thread(new Runnable() {
				public void run() {
					if (tf.getText().trim().equals(""))
						tf.setText("6");
					int n = Integer.parseInt(tf.getText());
					dices = new int[n];
					while (!stopRun) {
						dices[dice.dice(n)-1]++;
						repaint();
						try {Thread.sleep(10);} catch (InterruptedException e) {}
					}
					isRunning = false;
					dices = null;
					startStop.setText(("Start"));
				}}).start();
		}
	}
	class DiceP extends JPanel {
		protected void paintComponent(Graphics g) {
			super.paintComponent(g);
			if (dices == null) return;
			int w = getWidth();
			int h = getHeight();
			int n = dices.length;
			int max = 0;
			for (int i : dices)
				if (max < i)
					max = i;
			max *= 2;
			for (int i=0; i < n; ++i) {
				int hd = dices[i]*h/max;
				g.setColor(Color.black);
				g.drawRect(i*w/n, h-hd, w/n, hd);
				g.setColor(Color.cyan);
				g.fillRect(i*w/n+1, h-hd+1, w/n-2, hd-2);
			}
		}
	}
	public static void main(String[] args) {
		new DiceF();
	}
}

Die dice()-Methode terminiert nur dann nicht, wenn das Programm ewig rechnet! 😎
 
Leroy42 hat gesagt.:
Die dice()-Methode terminiert nur dann nicht, wenn das Programm ewig rechnet! 😎
Genau das gleiche Problem wie bei den bereits geposteten Vorschlägen :wink:
Mir fällt tatsächlich keine Methode ein die nach einer bestimmbaren Anzahl an Iterationen terminiert.
(ausser der Würfel hat 2^n Seiten.)
 
Leroy42 hat gesagt.:
Die dice()-Methode terminiert nur dann nicht, wenn das Programm ewig rechnet! 😎

Sollte eigentlich ein ironischer Hinweis auf die offensichtliche Tautologie sein.

Nur wenn dice() ewig aufgerufen wird, besteht die Möglichkeit, daß auch ewig die
falschen Zufallszahlen generiert werden ==> dice() terminiert nicht.

Aber wenn dice() ewig aufgerufen wird, terminiert das Programm
ja von Haus aus nicht :autsch:
 
Das mit der Tautologie versteh ich nicht: Eine Tautologie ist doch ein Ausdruck wie "voll und ganz"?
(Oder ist da eine andere gemeint?)
 
Tautologie = Pleonasmus ==

weisser Schimmer (Schimmel ist immer weiss)
grosser Riese (Riese ist immer gross)
kleiner Zwerg (Zwer ist immer klein)

oder:
terminiert nicht .... ewig rechnet (terminirt nicht = rechnet ewig)
 
Tautologie != Pleonasmus: Eine Tautologie ist historisch gewachsen und ein Ausdruck wie "voll und ganz"!

weisser Schimmer (Schimmel ist immer weiss)
grosser Riese (Riese ist immer gross)
kleiner Zwerg (Zwer ist immer klein)

Von deiner eigentümlichen Schreibweise einmal abgesehen: Es gibt auch Schimmel, die nicht nur weiß sind, ein Zwerg kann kleiner als ein Durchschnittszwerg sein und umgekehrt ist auch ein großer Riese kein Pleonasmus!

Übrigens wurde das 'ß' mit der Rechtschreibreform nicht abgeschafft.
 
merlin2 hat gesagt.:
Tautologie != Pleonasmus: Eine Tautologie ist historisch gewachsen und ein Ausdruck wie "voll und ganz"!

Ich kann auch Wiki lesen

merlin2 hat gesagt.:
Es gibt auch Schimmel, die nicht nur weiß sind, ein Zwerg kann kleiner als ein Durchschnittszwerg sein und umgekehrt ist auch ein großer Riese kein Pleonasmus!

Du bist sicher Staatsdiener? Oder Deutschleherer?

merlin2 hat gesagt.:
Übrigens wurde das 'ß' mit der Rechtschreibreform nicht abgeschafft.

Hab ich nicht auf meiner Tastatur.....und hab ich noch nie gebruacht.....nicht mal in Arbeiten.
Zudem scheiB ich auf die groBe NDR.....da find ich C99 intereBanter
:lol:
 
Was spricht dagegen Leherer zu werden?
(Ich könnte das zwar nicht, möchte aber gerne deine Meinung dazu wissen.)
 
Ich bezog mich auf das von dir fabrizierte Ungetüm,
das du vermutlich als Satz bezeichnen würdest;
nicht auf den verzeihbaren Tippfehler des müden Joe 😀
 
Jango hat gesagt.:
Aber klugscheißen kann er schon recht gut - das könnte ihm eine Karriere als Politiker sichern... :wink:

Das er mir da ja nicht in die Quere kommt! 😀

BTW: Du bist jetzt online? Mein ICQ-Light zeigt dich aber
leider nicht an 🙁
 
Leroy42 hat gesagt.:
Ich bezog mich auf das von dir fabrizierte Ungetüm,
das du vermutlich als Satz bezeichnen würdest;
nicht auf den verzeihbaren Tippfehler des müden Joe 😀
Ungetüm? Wo?
Es heißt verzeihlich und das ist es grundsätzlich nicht. Aber da er so müde ist könnte ich ihm tatsächlich verzeihen - dann wäre ich aber nicht merlin2!
klugscheißen kann er schon recht gut
Danke für das Kompliment.

Ich will immer noch wissen, warum man nicht Lehrer werden sollte! 🙂
 
"Leroy42" meint sicher den Satz hier:

"Ich bin Schüler. Dass du kein Leherer bist merkt man deiner Rechtschreibung."

a.) "Lehrer" ist falsch geschrieben.
b.) nach "bist" fehlt ein Komma.
c.) Zwischen "man" und "deiner" fehlt "an".
d.) Einen Satz beginnt man grundsätzlich nicht mit "Dass".
e.) Auch mit der neuen Rechtschreibung wird die persönliche Anrede groß geschrieben (obwohl das im Internet keiner macht).

Fazit:

In dem Satz sind so viele Fehler, dass man nur hoffen kann, unsere Kinder bekommen als Lehrer keinen von Deiner Sorte.

Immer daran denken: Bevor man andere kritisiert, erst in den Spiegel schauen. Du kennst doch sicher das Sprichwort mit dem "Glashaus", oder? :wink:

Und mir kannst Du das glauben - denn ich bin Deutschlehrerin. Peinlich, was?
 
a.) "Lehrer" ist falsch geschrieben.
b.) nach "bist" fehlt ein Komma.
c.) Zwischen "man" und "deiner" fehlt "an".
d.) Einen Satz beginnt man grundsätzlich nicht mit "Dass".
e.) Auch mit der neuen Rechtschreibung wird die persönliche Anrede groß geschrieben (obwohl das im Internet keiner macht).

a) Die falsche Schreibweise ist beabsichtigt, daher ist sie auch kursiv gesetzt.
b) und c) Das sind Flüchtigkeitsfehler (oder denkst du, dass ich meine Postings Korrektur lese?).
d) In Foren ist gegen Umgangssprache nichts einzuwenden.
e) Beides ist erlaubt.
f) Ich habe auch dieses Posting nicht Korrektur gelesen, wer einen Fehler findet darf ihn gerne behalten.
g) Danke für die konstruktive Kritik; wenn du noch weitere hast, möchte ich sie gerne lesen.

Übrigens (Das ist nicht böse gemeint.): Einen neuen Satz beginnt man mit einem Großbuchstaben.
 
Ich hab ja nichts dagegen gesagt - Du warst es, der geschrieben hat: Es sei nicht verzeihlich!!!
 
<Spam>
merlin2 hat gesagt.:
Ich habe auch dieses Posting nicht Korrektur gelesen, wer einen Fehler findet darf ihn gerne behalten.
Nicht nachgeben bitte! Ich würde heute gern nochmal n bisschen lachen.
"Du schreibst falsch/kannst kein Deutsch"
"Nein Du"
"Nein Du"... :wink:

Die korrekte Antwort wäre doch gewesen: "das war ich nicht, das hat das blöde Forum gemacht!"
</Spam>
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben