# verstehe aufgabenstellung nicht!



## Amaru (23. Mai 2007)

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()


```
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


```
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

```
publich static void main(String[] args){

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

kann mir jemand weiterhelfen?[/code]


----------



## merlin2 (23. Mai 2007)

Du übergibst flipCoin einen Parameter, ohne dass das vorgesehen ist, daher der Fehler!


----------



## madboy (23. Mai 2007)

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


```
static int flipCoin(){ 
      return (int)Math.random();

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

Gruß,
madboy


----------



## Gast (23. Mai 2007)

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


----------



## Amaru (23. Mai 2007)

dann könnt ich auch 

public int flipCoin(){
return (int)((Math.random()+0.5);
} 

machen oder


----------



## Sharpner (23. Mai 2007)

ja geht auch


----------



## Amaru (23. Mai 2007)

gut.

hat keiner ne idee zur b)?


----------



## Der Müde Joe (23. Mai 2007)

```
public int dice(int max){
	double i = Math.random();
	int result = (int)(i * max)+1;
	return result;
}
```

EDIT:
if(max > 0) noch vergessen


----------



## Sharpner (23. Mai 2007)

ich dachte man soll den Würfel mit flipCoin() simulieren?


----------



## madboy (23. Mai 2007)

```
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


----------



## Der Müde Joe (23. Mai 2007)

```
public int dice(int max){
	int result = 0;
	for(int i = 0 ; i < max ; i++){
		result += flipCoin();
	}
	return result;
}
```

ungetestet

EDIT:
noch unfairer


----------



## Sharpner (23. Mai 2007)

joa das hab ich auch probiert, ist aber eher ne Normalverteilung als ein Laplace Würfel^^


----------



## Amaru (23. Mai 2007)

aha, soweit versteh ichs glaub ich aber was muss ich machen, dass er fair ist, was für ne überlegung muss ich anstellen?


----------



## madboy (23. Mai 2007)

```
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


----------



## Der Müde Joe (23. Mai 2007)

EDIT: war sch****


----------



## Wildcard (23. Mai 2007)

Es besteht allerdings (wie auch bei madboys Version) die geringe Wahrscheinlichkeit einer Endlosschleife :lol:

```
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;
	}
}
```


----------



## Sharpner (24. Mai 2007)

hmmm das passt aber wieder nicht zur Aufgabenstellung ausschliesslich java.lang.* zu benutzen ^^


----------



## Wildcard (24. Mai 2007)

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:


----------



## Leroy42 (24. Mai 2007)

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!


----------



## Wildcard (24. Mai 2007)

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.


----------



## madboy (24. Mai 2007)

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


----------



## Leroy42 (24. Mai 2007)

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


----------



## madboy (24. Mai 2007)

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:


----------



## harlequin_ (24. Mai 2007)

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


----------



## harlequin_ (24. Mai 2007)

Nach einiger Fehlersuche und ein paar Änderungen im Code bin ich nun zu folgendem Schluss gekommen:


----------



## harlequin_ (24. Mai 2007)

doofes Forum... 

http://phpfi.com/236622

das hier wollte ich noch anhängen und im voraus schonmal entschuldigung!


----------



## Leroy42 (24. Mai 2007)

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.


```
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:

```
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!


----------



## Wildcard (24. Mai 2007)

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 (25. Mai 2007)

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:


----------



## merlin2 (25. Mai 2007)

Das mit der Tautologie versteh ich nicht: Eine Tautologie ist doch ein Ausdruck wie "voll und ganz"?
(Oder ist da eine andere gemeint?)


----------



## Der Müde Joe (25. Mai 2007)

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)


----------



## merlin2 (25. Mai 2007)

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.


----------



## Der Müde Joe (25. Mai 2007)

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:


----------



## merlin2 (25. Mai 2007)

Der Müde Joe hat gesagt.:
			
		

> Du bist sicher Staatsdiener? Oder Deutschleherer?



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


----------



## Guest (25. Mai 2007)

merlin2 hat gesagt.:
			
		

> Ich bin Schüler. Dass du kein _Leherer_ _bist merkt man deiner Rechtschreibung_.



Wirst du aber (hoffentlich) auch nicht werden! (  )


----------



## Leroy42 (25. Mai 2007)

Uuuppss (nicht eingeloggt) War ich eben!


----------



## merlin2 (25. Mai 2007)

Was spricht dagegen _Leherer_ zu werden?
(Ich könnte das zwar nicht, möchte aber gerne deine Meinung dazu wissen.)


----------



## Leroy42 (25. Mai 2007)

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 (25. Mai 2007)

Leroy42 hat gesagt.:
			
		

> merlin2 hat gesagt.:
> 
> 
> 
> ...



Nee, wird er garantiert nicht. Aber klugscheißen kann er schon recht gut - das könnte ihm eine Karriere als Politiker sichern...  :wink:


----------



## Leroy42 (25. Mai 2007)

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


----------



## Jango (25. Mai 2007)

Leroy42 hat gesagt.:
			
		

> BTW: Du bist jetzt online? (



Öhm...ja - dadurch schreibt es sich im Internet wesentlich besser.


----------



## merlin2 (25. Mai 2007)

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 verzeih_lich_ 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!


----------



## Jango (25. Mai 2007)

"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?


----------



## merlin2 (25. Mai 2007)

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.


----------



## Jango (25. Mai 2007)

Ich hab ja nichts dagegen gesagt - Du warst es, der geschrieben hat: Es sei nicht verzeihlich!!!


----------



## madboy (25. Mai 2007)

<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>


----------



## merlin2 (3. Jun 2007)

Jango hat gesagt.:
			
		

> Ich hab ja nichts dagegen gesagt - Du warst es, der geschrieben hat: Es sei nicht verzeihlich!!


 Muss ich immer alles ernst meinen?


----------



## merlin2 (3. Jun 2007)

Wird die persönliche Anrede tatsächlich großgeschrieben?


----------

