23: Vektoren 1 – Zufallszahlen

 
  • Erstellen Sie einen Vektor z (Datentyp int) bestehend aus n Zufallszahlen im Intervall [1, 100]
  • Zählen Sie die Häufigkeit des Vorkommens der (ganzen) Zahlen in diesem Intervall, indem Sie einen weiteren Vektor h (mit 100 Elementen) bilden und darin jeweils die Häufigkeit des betreffenden Zahl ablegen. (Beispiel: h[i] = Häufigkeit der Zahl i im Vektor z)
  • Zeichnen Sie eine Grafik für h[i]
  • Berechnen Sie einen neuen Vektor w, indem Sie aus den jeweils benachbarten m Werten aus dem Vektor z den Mittelwert bilden und diesen Mittelwert in w ablegen.
  • Bestimmen Sie auch für den Vektor w die Häufigkeit des Vorkokmmens im Vektor h und zeichnen Sie den Graphen h[i]
  • Wie ändern sich die Graphen in Abhängigkeit von m? Zeichnen Sie dazu mehrere Graphen in ein Grafikfenster

Lösung

Zur Lösung dieser Aufgabe wird die Datei unibwm.jar benötigt. Sie kann in der Eclipse Umgebung in den Projektoptionen unter “add external jar” hinzugefügt werden.

import unibwm.*;			// Grafik für die Ausgabe der Diagramme
import java.util.Scanner; 	// Scanner für die Eingabe von n

public class Aufgabe23
{
	static final int iFaktorX = 5;
	static final int iFaktorY = 20;
	static final int iIntervall = 100;

	public static void main(String[] args)
	{
		Scanner scnEingabe = new Scanner(System.in);
		System.out.print("n eingeben: ");
		int iAnzahlGesamt = scnEingabe.nextInt();
		int iMax = 0;
		int[] iZufall = new int[iAnzahlGesamt];
		int[] iAnzahl = new int[iIntervall + 1];
		Grafik gfkAusgabe = new Grafik();

		for(int i = 0; i < iAnzahlGesamt; ++ i)
		{
			iZufall[i] = (int) (Math.random() * iIntervall + 1);
			//System.out.println(iZufall[i]);
			++ iAnzahl[iZufall[i]];
		}

		for(int i = 1; i <= iIntervall; ++ i)
			if (iAnzahl[i] > iMax)
				iMax = iAnzahl[i];

		ZeichneDiagramm(iAnzahl, gfkAusgabe, 10, 10, iMax, "original");

		iAnzahl = GemittelterVektor(iAnzahl);
		ZeichneDiagramm(iAnzahl, gfkAusgabe,
				10 , 20 + iMax * iFaktorY, iMax, " 1 x gemittelt");

		iAnzahl = GemittelterVektor(iAnzahl);
		ZeichneDiagramm(iAnzahl, gfkAusgabe,
			10 + 110 * iFaktorX, 20 + iMax * iFaktorY, iMax, "2 x gemittelt");

		iAnzahl = GemittelterVektor(iAnzahl);
		iAnzahl = GemittelterVektor(iAnzahl);
		ZeichneDiagramm(iAnzahl, gfkAusgabe,
			10 + 110 * iFaktorX, 10 , iMax, "4 x gemittelt");

		gfkAusgabe.show("Ausgabe der Diagramme");
	}

	public static void ZeichneDiagramm(int[] iAnz, Grafik gfkAusg,
			int iStartX, int iStartY, int iMaximum, String sText)
	{

		// Koordinatenachsen:
		gfkAusg.addLine(iStartX, iStartY, iStartX + 100 * iFaktorX, iStartY);
		gfkAusg.addLine(iStartX, iStartY, iStartX,
				iStartY + iMaximum * iFaktorY);

		// Beschriftung:
		gfkAusg.addText(iStartX + 5, iStartY + 5, sText);

		for(int i = 1; i < iIntervall; ++ i)
			gfkAusg.addLine(i * iFaktorX + iStartX,
					iAnz[i] * iFaktorY + iStartY,
					(i + 1) * iFaktorX + iStartX,
					iAnz[i+1] * iFaktorY + iStartY);
	} // end ZeichneDiagramm

	public static int[] GemittelterVektor(int[] iVektor)
	{
		int[] iErgebnis = new int[iVektor.length];
		iErgebnis[0] = iVektor[0];
		iErgebnis[iVektor.length - 1] = iVektor[iVektor.length - 1];

		for(int i = 1; i < iVektor.length - 1; ++ i)
			iErgebnis[i] = (int) (.5 * (iVektor[i - 1] + iVektor[i + 1]));
		return iErgebnis;
	} // end GemittelterVektor
}

Teil b:

import unibwm.*;			// Grafik für die Ausgabe der Diagramme

public class Aufgabe23b
{
	static final int iFaktorX = 5;
	static final int iFaktorY = 20;
	static final int iIntervall = 100;
	static final int iDiagramme = 4;
	static final int[] iRadius = {1, 3, 6};

	public static void ZeichneDiagramm(int[] iAnzahl, Grafik gfkAusg,
			int iStartX, int iStartY, int iMaximum, String sText)
	{

		// Koordinatenachsen:
		gfkAusg.addLine(iStartX, iStartY, iStartX + 100 * iFaktorX, iStartY);
		gfkAusg.addLine(iStartX, iStartY, iStartX,
				iStartY + iMaximum * iFaktorY);

		// Beschriftung:
		gfkAusg.addText(iStartX + 5, iStartY + 5, sText);

		for(int i = 0; i < iIntervall - 1; ++ i)
			gfkAusg.addLine(i * iFaktorX + iStartX,
					iAnzahl[i] * iFaktorY + iStartY,
					(i + 1) * iFaktorX + iStartX,
					iAnzahl[i+1] * iFaktorY + iStartY);
	} // end ZeichneDiagramm

	public static int[] GemittelteWerte(int[] iVektor, int iRadius)
	{
		int[] iErgebnis = new int[iVektor.length];

		for (int i = 0; i < iVektor.length; ++ i)
		{
			int iSumme = 0, iSummanden = 0;
			for (int j = i - iRadius; j <= i + iRadius; ++ j)
			{
				if (j >= 0 && j < iVektor.length)
				{
					iSumme += iVektor[j];
					++ iSummanden;
				} // end if
			} // end for
			iErgebnis[i] = iSumme / iSummanden;
		} // end for
		return iErgebnis;
	} // end GemittelteWerte

	public static void main (String args[])
	{
		// Variablen Deklaration
		int iAnzahlZahlen;
		int iWert[], iAnzahl[];
		int[][] iGemittelterWert;
		int iMax;
		Grafik gfkAusgabe = new Grafik();

		// Variablen Initialisierung
		iAnzahlZahlen = 1000;
		iWert = new int[iAnzahlZahlen];
		iAnzahl = new int[iIntervall];
		iGemittelterWert = new int[iDiagramme-1][iIntervall];
		iMax = 0;

		// Erstellen der Zufallszahlen
		for (int i = 0; i < iAnzahlZahlen; ++ i)
			iWert[i] = (int) (Math.random() * iIntervall);;

		// Initialisieren des Zählvektors
		for (int i = 0; i < iIntervall; ++ i)
			iAnzahl[i] = 0;

		// Zählen der Werte
		for (int i = 0; i < iAnzahlZahlen; ++ i)
			++ iAnzahl[iWert[i]]; 

		// Maximum finden
		for(int i = 0; i < iIntervall; ++ i)
			if (iAnzahl[i] > iMax)
				iMax = iAnzahl[i];

		// original zeichnen
		ZeichneDiagramm(iAnzahl, gfkAusgabe, 10, 10, iMax, "original");

		// werte mitteln
		iGemittelterWert[0] = GemittelteWerte(iAnzahl, iRadius[0]);

		// neu zeichnen
		ZeichneDiagramm(iGemittelterWert[0], gfkAusgabe,
				10 , 20 + iMax * iFaktorY, iMax,
				" mit Radius " + iRadius[0] + " gemittelt");

		// werte mitteln
		iGemittelterWert[1] = GemittelteWerte(iAnzahl, iRadius[1]);

		// neu zeichnen
		ZeichneDiagramm(iGemittelterWert[1], gfkAusgabe,
				10 + 110 * iFaktorX, 20 + iMax * iFaktorY, iMax,
				" mit Radius " + iRadius[1] + " gemittelt");

		// werte mitteln
		iGemittelterWert[2] = GemittelteWerte(iAnzahl, iRadius[2]);

		// neu zeichnen
		ZeichneDiagramm(iGemittelterWert[2], gfkAusgabe,
				10 + 110 * iFaktorX, 10, iMax,
				" mit Radius " + iRadius[2] + " gemittelt");

		gfkAusgabe.show("Ausgabe der Diagramme");
	} // end main
} // end Aufgabe23b