[Gelöst]Zufallszahlen sortieren /Macro geht nicht

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: [Gelöst]Zufallszahlen sortieren /Macro geht nicht

Re: [Gelöst]Zufallszahlen sortieren /Macro geht nicht

von mikeleb » Di, 20.11.2018 17:46

Hallo balu,
die allgemeine Formel ist schon so richtig.
Das

Code: Alles auswählen

cint(rnd()*5*n)+n
ist nur auf die konkrete Situation des TE angepasst, der mit n 6er Würfeln würfeln möchte und damit der Zufallsbereich von n bis 6n geht und schon sind wir bei deiner Formel ...

Re: [Gelöst]Zufallszahlen sortieren /Macro geht nicht

von balu » Di, 20.11.2018 16:48

Hallo mikeleb,

jetzt weiss ich auch warum mein Kopf in den letzten Tagen so verrückt gespielt hat. Der Winter klopft an die Tür, Nass-Kalte 2° C, blöder Wind und Schneefall. *grrrr*


Bäck tho toppik.
gleichverteilte Zufallszahlen
Auch wenn diese Aussage irgendwie seine Berechtigung hat, besonders wenn man sich das hier durchliest: https://www.mathematik.tu-clausthal.de/ ... llszahlen/ , so denke ich mir mal das wir die Kirche im Dorfe lassen wollen. Für mich ist Zufall schlicht ergreifend einfach Zufall. Und wenn der Zufall gleichverteilt ist, oder wie auch immer, dann ist das für mich kein Zufall mehr sondern ein berechenbares System. Aber da können wir uns bei einem heißen Pott Glühwein unterhalten, nur nicht hier. :lol:


Du bleibst bei deiner Methode die im Grunde so aussieht.

Code: Alles auswählen

rnd()*5
Du lässt dir nicht den "Zufallsbereich" (ich nenne das jetzt mal so) ausrechnen, sondern Du gibst einen festen Wert vor. Und das mag ja auch wohl irgendwie funktionieren, weil es ja nur um den Zahlenbereich von inklusive 1 bis einschließlich 6 geht. Aber wie sieht das denn aus, wenn der Zahlenbereich von 97-123 geht?

Und deshalb hatte ich meine Methode vorgeschlagen, die wie folgt aussieht.

Code: Alles auswählen

Cint(rnd()*(GrößteZahl-KleinsteZahl) +KleinsteZahl)
An dieser Stelle eine andere Frage.
Kennst Du eigentlich meinen "Passwortgenerator" schon (Er genriert ein 8 Stelliges "Passwort")?
Den findest Du in diesem Thread: viewtopic.php?t=62016
Da steht auch warum ich meine Methode angewendet habe.


Ich zieh mich wieder zurück. Ich werd einfach nicht warm. Ab in meine "Brummelhöhle"



Gruß
balu

Re: [Gelöst]Zufallszahlen sortieren /Macro geht nicht

von mikeleb » Di, 20.11.2018 14:12

Hallo,
es war natürlich teilweise Unsinn, was ich zum Zufallszahlenbereich schrieb. rnd() liefert gleichverteilte Zufallszahlen im Intervall [0;1[, d. h. ohne die 1.
rnd()*6 erzeugt somit Zufallszahlen im Intervall [0;6[ (ohne 6). Durch die Abrundung per int(rnd()*6) werden somit nur die Zahlen 0, 1, 2, 3, 4 und 5 erzeugt. Für die Zufallszahlen von 1 bis 6 muss also int(rnd()*6)+1 gerechnet werden.
Um also die ganzzahligen Zufallszahlen im Bereich [a;b] (inkl. a und b) zu erzeugen, muss man demzufolge int(rnd()*(b-a+1))+a nutzen.
Nutzt man cint() so wird math. gerundet, also wie balu schon schrieb: int(rnd()*(b-a))+a oder int(rnd()*(b-a)+a)
Also wird in meinem Makro aus:

Code: Alles auswählen

z=int(rnd()*5*n)+n+aSpalteINI(i)(0)+aSpalteINI(i)(1)+aSpalteINI(i)(2)
nun korrekterweise:

Code: Alles auswählen

z=int(rnd()*(5*n+1))+n+aSpalteINI(i)(0)+aSpalteINI(i)(1)+aSpalteINI(i)(2)
bzw.

Code: Alles auswählen

z=cint(rnd()*5*n)+n+aSpalteINI(i)(0)+aSpalteINI(i)(1)+aSpalteINI(i)(2)
Anmerkung: Die Variante mit +0,5 liefert auch Zufallszahlen im gewünschten Bereich, nur nicht gleichverteilt.

Re: [erstmal Gelöst]Zufallszahlen sortieren /Macro geht nicht

von Taghor » Di, 20.11.2018 00:23

Danke
hoffe fertig
Gelöst

habe aus verschiedenen Formeln was zusammengebastelt da ich noch ne Zufallszahl eingefügt hatte.

Re: [erstmal Gelöst]Zufallszahlen sortieren /Macro geht nicht

von mikeleb » Mo, 19.11.2018 22:44

Hallo,
ist ja richtig - ändere

Code: Alles auswählen

z=int(rnd()*5*n)+n+aSpalteINI(i)(0)+aSpalteINI(i)(1)+aSpalteINI(i)(2)
in

Code: Alles auswählen

z=int(rnd()*5*n+0.5)+n+aSpalteINI(i)(0)+aSpalteINI(i)(1)+aSpalteINI(i)(2)
rnd() liefert ja eine Zufallszahl aus dem Intervall [0;1] (theoretisch schön gleichverteilt). Daher sollte man meinen, dass rnd()*5 eine Zahl zwischen 0 und 5 liefert - macht es auch, aber durch das abschließende Abrunden durch int() würde nur ein einziger Zufallswert (nämlich die 5) auch zur 5 abgerundet (aus der Gleichverteilung wird eine schiefe, die Werte 0-4 treten erheblich häufiger auf als die 5). Durch die Addition einer 0,5 wird die Gleichverteilung wieder hergestellt. Es werden nun Zufallszahlen zwischen 0,5 und 5,5 erzeugt, die abgerundet die (natürlichen) Zahlen 0 bis 5 liefern.

Das Sortieren kann natürlich auch in ein extra Makro gepackt werden. Wenn aber sowieso nach jedem Würfeln sortiert werden soll, dann gleich in eines.

Re: [erstmal Gelöst]Zufallszahlen sortieren /Macro geht nicht

von balu » Mo, 19.11.2018 21:34

Hallo Leute,

um eine Zufällige Zahl innerhalb eines bestimmten Bereiches zu ziehen, gehe ich wie folgt vor.
Erstmal ein Pseudo-Code

Code: Alles auswählen

Cint(rnd()*(GrößteZahl-KleinsteZahl) +KleinsteZahl)
Um jetzt eine Zahl vom Würfel zu ziehen, würde das dann so aussehen.

Code: Alles auswählen

Cint(rnd()*(6-1) +1)

Zur Info.
Das hier

Code: Alles auswählen

Cint(rnd()*(6-1) *1)
ist nicht gut. Da in diesem Falle auch eine 0 (Null) gewürfelt wird, aber die 6 nicht fällt (man kann auch sagen, das die 6 entfällt).


Mehr habe ich momentan nicht zu bieten. :oops:



Gruß
balu

Re: [erstmal Gelöst]Zufallszahlen sortieren /Macro geht nicht

von Taghor » Mo, 19.11.2018 20:25

Mikeleb der Code is ja super :-) das problem was ich habe ist nur das er scheinbar nur zahlen von 1 bis 5 macht weil habe keine 6 in der liste.
Ob das sofort Sortieren dem Spielleiter gefällt kläre ich ab.
änder ich bei rnd *5* in 6 um macht er mir zahlen zwischen 1 und 6
aber bei 2 würfeln macht er mir zahlen zwischen 2 und 13 hmm ich doctor später da nochmal selber rum aber danke erstmal :-) .
versuche mal die nächste Lösung

Re: [erstmal Gelöst]Zufallszahlen sortieren /Macro geht nicht

von Taghor » So, 18.11.2018 22:08

@mikeleb du meinst dein Macroprogramm ? ich habe es nocht nicht getestet werde ich aber morgen oder übermorgen machen.
jetzt läuft es erstmal aber das er 10 sekunden braucht um alle Zufalsszahlen zu generieren.

Aber danke für eure Verbesserungsvorschläge

Re: [erstmal Gelöst]Zufallszahlen sortieren /Macro geht nicht

von mikeleb » So, 18.11.2018 21:36

Hallo,
damit es schneller eingetragen wird bin ich dankbar
Warum machst du es dir so kompliziert? Anders gefragt: Was passt an meinem Vorschlag nicht? (Damit will ich nicht sagen, dass er besonders gut sei oder dass du ihn nutzen musst!)

Re: [erstmal Gelöst]Zufallszahlen sortieren /Macro geht nicht

von Taghor » So, 18.11.2018 18:11

Das is die Letzte Version von mir mit 12 Spalten.
incl. den Button für Würfeln und einen zum anschließenden sortieren.

Die Spalte A hat die Zufallszahl und andere Werte Verbunden damit ich eine Zahl zum sortieren habe.
( ja ich weiß habe beim Verketten noch nen denkfehler drinnen die Ini von 8 ist größer als eine 70 aber das schaffe ich noch :D )

wenn jetzt einer das Macro ändern möchte / will /bitte Bitte damit es schneller eingetragen wird bin ich dankbar.

Achten auf Crossposting
Dateianhänge
SR 5 Ini 99% 4.02.ods
(68.64 KiB) 129-mal heruntergeladen

Re: Zufallszahlen sortieren /Macro geht nicht

von Taghor » So, 18.11.2018 17:35

Weil jede Person würfelt mit einem 6 seitigen würfel.
und aber jeder von 1 bis 12 solcher würfel haben kann womit er würfelt.

jetzt habe ich 12 würfelwerte und habe es so in die Tabelle geschrieben das er mir die Werte
zusammenrechnet je nachdem ob er 1 oder 3 oder 10 Würfel hat.

Ich werde mir die anderen Lösungen noch genau anschauen aber da das dauert denke ich
markiere ich den Beutrag lieber als Gelöst und fals ich ein neues Problem habe schreibe ich erneut.

Re: Zufallszahlen sortieren /Macro geht nicht

von mikeleb » So, 18.11.2018 16:42

Hallo,
ich habe nicht alles verstanden (insbesondere wo/was die 12 Zeilen sein sollen).
Hier mal ein Vorschlag:

Code: Alles auswählen

sub Wurfel
	'Zugriff auf das Dokument
	odoc=ThisComponent
	otab=odoc.sheets(0)
	'finde den benutzten Bereich
	ocur=otab.createcursor
	ocur.gotoendofusedarea(false)
	letzte_zeile=ocur.rangeaddress.endrow
	letzte_spalte=ocur.rangeaddress.endcolumn
	'Spalte E auslesen
	aSpalteE=otab.getcellrangebyposition(4,3,4,letzte_zeile).getDataArray
	'Spalten AY-BC auslesen
	aSpalteINI=otab.getcellrangebyposition(50,3,54,letzte_zeile).getDataArray
	'schreibe INI-Wert in Spalte BC, wenn in Spalte E ein "X" steht
	'INI-Wert ist AY+AZ+BA+Zufallszahl
	'Zufallszahl aus Bereich von BB bis 6*BB
	for i=0 to ubound(aSpalteE())
		if aSpalteE(i)(0)="X" then
			'wie viele 6er Würfel
			n=aSpalteINI(i)(3)
			z=int(rnd()*5*n)+n+aSpalteINI(i)(0)+aSpalteINI(i)(1)+aSpalteINI(i)(2)
			aSpalteINI(i)(4)=z
		end if
	next
	'INI-Werte in Tabelle schreiben
	otab.getcellrangebyposition(50,3,54,letzte_zeile).setDataArray(aSpalteINI())
	'Bereich sortieren
	Dim SortProps(2) As new com.sun.star.beans.PropertyValue
	Dim SortFeld(0) As new com.sun.star.table.TableSortField
	oBereich = otab.getcellrangebyposition(0,3,letzte_spalte,letzte_zeile)
	SortFeld(0).Field = 0
	SortFeld(0).IsAscending = False
	SortProps(0).Name = "SortFields"
	SortProps(0).Value = SortFeld()
	SortProps(1).Name = "SortColumns"
	SortProps(1).Value = False
	SortProps(2).Name = "ContainsHeader"
	SortProps(2).Value = False
	oBereich.Sort(SortProps())

end sub
Das Makro schreibt in die Spalte BC die gewünschten INI-Werte (AY+AZ+BA+Zufallswert). Allerdings nur in den Zeilen, in denen in Spalte E ein "X" steht.
Anschließend wir die ganze Tabelle (ab Zeile 4) nach Spalte A absteigend sortiert.
Ich arbeite mit den Methoden .getDataArray und .SetDataArray, die einfach schneller sind als der zellenweise Zugriff. Da damit keine Formeln geschrieben werden, muss man manchmal vorsichtig sein. Hier könnte etwas schiefgehen, wenn in den Spalten AY-BC irgendwo Formeln stehen würden!

Re: Zufallszahlen sortieren /Macro geht nicht

von Stephan » So, 18.11.2018 16:38

mit .setDataArray() ist sowas schneller

Code: Alles auswählen

REM Zufallszahl zwischen 1 und 20 erzeugen und in gewünschten Zellbereich schreiben
Sub xZufall
Dim oDoc as Object	' Objektvariable für das aktuelle Dokument
Dim oCC as Object	' Objektvariable für den Currentcotroller. Damit ist z.B. ein Zellzugriff möglich

Dim i as Integer	' Zählervariable vom Datantyp Integer
Dim x as Integer	' Variable zur Aufnahme der Zufallszahl vom Datantyp Integer

' Referenzierungen der Objektvariablen
oDoc=ThisComponent
oCC =oDoc.CurrentController

	Dim Werte(197)
	Dim w_temp(11)
	For i = 0 To 197 '3-200
		Redim w_temp(11)
		For j = 0 To 11 '55-66
			w_temp(j) = Int(6 * Rnd) +1
		Next j
		Werte(i) = w_temp()
	Next i
	
	oCC.ActiveSheet.getCellRangeByPosition(55,3,66,200).setDataArray(Werte())
End Sub

Gruß
Stephan

Re: Zufallszahlen sortieren /Macro geht nicht

von Taghor » So, 18.11.2018 16:19

Code: Alles auswählen

REM Zufallszahl zwischen 1 und 20 erzeugen und in gewünschten Zellbereich schreiben
Sub xZufall
Dim oDoc as Object	' Objektvariable für das aktuelle Dokument
Dim oCC as Object	' Objektvariable für den Currentcotroller. Damit ist z.B. ein Zellzugriff möglich

Dim i as Integer	' Zählervariable vom Datantyp Integer
Dim x as Integer	' Variable zur Aufnahme der Zufallszahl vom Datantyp Integer

' Referenzierungen der Objektvariablen
oDoc=ThisComponent
oCC =oDoc.CurrentController

' getCellByPosition ( [in] long nColumn, [in] long nRow )
REM Zählerschleife über Zelle O4:O16 
	For i = 3 to 200
			x= Int(6 * Rnd) +1
		oCC.ActiveSheet.getCellByPosition(55,i).value= x
	next i

	For i = 3 to 200
			x= Int(6 * Rnd) +1
		oCC.ActiveSheet.getCellByPosition(56,i).value= x
	next i

	For i = 3 to 200
			x= Int(6 * Rnd) +1
		oCC.ActiveSheet.getCellByPosition(57,i).value= x
	next i

	For i = 3 to 200
			x= Int(6 * Rnd) +1
		oCC.ActiveSheet.getCellByPosition(58,i).value= x
	next i
	
		For i = 3 to 200
			x= Int(6 * Rnd) +1
		oCC.ActiveSheet.getCellByPosition(59,i).value= x
	next i

	For i = 3 to 200
			x= Int(6 * Rnd) +1
		oCC.ActiveSheet.getCellByPosition(60,i).value= x
	next i

	For i = 3 to 200
			x= Int(6 * Rnd) +1
		oCC.ActiveSheet.getCellByPosition(61,i).value= x
	next i
	For i = 3 to 200
			x= Int(6 * Rnd) +1
		oCC.ActiveSheet.getCellByPosition(62,i).value= x
	next i

	For i = 3 to 200
			x= Int(6 * Rnd) +1
		oCC.ActiveSheet.getCellByPosition(63,i).value= x
	next i
	For i = 3 to 200
			x= Int(6 * Rnd) +1
		oCC.ActiveSheet.getCellByPosition(64,i).value= x
	next i

	For i = 3 to 200
			x= Int(6 * Rnd) +1
		oCC.ActiveSheet.getCellByPosition(65,i).value= x
	next i
	For i = 3 to 200
			x= Int(6 * Rnd) +1
		oCC.ActiveSheet.getCellByPosition(66,i).value= x
	next i

End Sub
Ich habe versucht das mir zugeschickte so zu ändern und scheinbar gibt er mir jetzt 12 Spalten mit Zufallszahlen aus von 1 bis 6 ( durch RND +1)
es dauert zwar ein bischen die jeweils 200 Zeilen zu füllen aber egal.
Es sei denn einer hat eine einfachere Lösung das ich X * 1W6 würfel ausrechnen kann.
Da Crossposting schreibe ich das hier ins andere Forum auch noch rein.

wie gesagt würde mich über weitere Verbesserungen freuen und danke.

Re: Zufallszahlen sortieren /Macro geht nicht

von Taghor » So, 18.11.2018 13:17

Danke für die Hilfe.
In Spalte BD oder BC soll die Zufalszahl hin und zwar ein 6 Seitiger Würfel.
In Spalte BB steht drinnen wieviel würfel gewürfelt werden. z.b. 3 Stck. dann müßte ich ein ergeniss haben von 3 bis 18
( und nicht einfach die Zufallszahl von 1 bis 6 mal 3 nehmen weil dann würde ja nur als ergebniss 3/6/9/12/15/18 rauskommen.
In spalte A übernehme ich die Zahl von hinten einfach verkette sie noch mit ein paar anderen Zahlen und sortiere dann die Komplette Tabelle
nach spalte A absteigend.
(ersten 3 Spalten bleiben so weil überschriften)

Mir würde auch reichen wenn ich am ende 12 spalten mit jedweils 1w6 Zahlen bekomme da kann ich dann mit Formeln die passenden Anzahl zusammenzählen.
Hatte es ja mit Macro aufzeichnen versucht hinten in BD die Zufallszahlen zu kopieren und dann in BC mit Inhalt einfügen einzufügen.
aber leider klappt das aufgezeichnete Macro auch nicht :-(

Die Tabelle wird an Zeilen noch weiter mit der Zeit sich füllen.
Und Zufallszahl muß öfters erzeugt und kopiert werden bei der benutzung deswegen ist ein jedesmal Kopieren/ Inhalt einfügen usw zu aufwendig/zeitintensiv/ sich drauf zu konzentrieren müssen, weil ja auch noch jedesmal etliche andere Werte geändert werden müssen.


Die Zahl 199 is einfach nur die letzte Zeile der aktiven liste , habe ich deswegen weil formeln bis darein gehen damit sie die formeln automatisch erweitern wenn neue Zeilen eingefügt werden.
Die Zahlen 166 bis 148 sind einfach dafür da das sie immer unterhalb der bespielten liste sind.
Und die Zeilen mit 100 sind dafür da das sie auf reserve sind und ganz unterhalb sind und mich im moment nicht stören.
achja die 101 wird dazwischengesetzt falls einer keine Initiative mehr hat :-)

Code: Alles auswählen

REM Zufallszahl zwischen 1 und 6 erzeugen und in gewünschten Zellbereich schreiben
Sub xZufall
Dim oDoc as Object	' Objektvariable für das aktuelle Dokument
Dim oCC as Object	' Objektvariable für den Currentcotroller. Damit ist z.B. ein Zellzugriff möglich

Dim i as Integer	' Zählervariable vom Datantyp Integer
Dim x as Integer	' Variable zur Aufnahme der Zufallszahl vom Datantyp Integer

' Referenzierungen der Objektvariablen
oDoc=ThisComponent
oCC =oDoc.CurrentController

' getCellByPosition ( [in] long nColumn, [in] long nRow )
REM Zählerschleife über Zelle O4:O16 
	For i = 3 to 201
		' Leere Zellen in Spalte "O" beim Schreibvorgang überspringen
		if i = 200  then goto weiter

		' Zufallszahl erzeugen und in Variable "x" schreiben
				x= Int(6 * Rnd)
		' PRÜFUNG: Ist x = 0?
		' Wenn 20 * Rnd = 0, bzw. kleiner 1 ist, dann 
		' Wird der Zähler (i) um 1 subtrahiert. 
		' Dadurch erhält man dann 8 Zahlen zwischen 1 und 20, und ohne 0
		if x <=1 then 
			i=i-1
			 goto weiter
		End if
		' Wert aus "x" in Zielzelle schreiben
		' Die Adressierung der Zielzelle erfolgt hierdurch:
		' getCellByPosition(14,i)	14 ist die Spalte "O".
		' "i" ist die Zählervariable. Gestartet wird die Zählung bei 3 und endet bei 15
		' Immer daran denken, die Zählung beginnt für Zeilen und Spalte immer bei 0 -->  0,1,2,3...
		' Beispiel: 
		' "A1" = 0,0 --> (Spalte,Zeile)
		' Somit ist "O4" = 14,3 --> (Spalte,Zeile)		
		oCC.ActiveSheet.getCellByPosition(55,i).value= x
weiter:		
	next i

End Sub
hab das schon mal bekommen und hab es angepaßt habe versucht die formel zu erweitern damit ich vieleicht 12 Spalten mit Zufallszahl hinbekomme.
Ich war zu blöd.

Code: Alles auswählen

REM Zufallszahl zwischen 1 und 20 erzeugen und in gewünschten Zellbereich schreiben
Sub xZufall
Dim oDoc as Object	' Objektvariable für das aktuelle Dokument
Dim oCC as Object	' Objektvariable für den Currentcotroller. Damit ist z.B. ein Zellzugriff möglich

Dim i as Integer	' Zählervariable vom Datantyp Integer
Dim x as Integer	' Variable zur Aufnahme der Zufallszahl vom Datantyp Integer
Dim Y as Integer

' Referenzierungen der Objektvariablen
oDoc=ThisComponent
oCC =oDoc.CurrentController

' getCellByPosition ( [in] long nColumn, [in] long nRow )
REM Zählerschleife über Zelle O4:O16 
	For i = 3 to 201
		' Leere Zellen in Spalte "O" beim Schreibvorgang überspringen
		if i = 200 then goto weiter

		' Zufallszahl erzeugen und in Variable "x" schreiben
				x= Int(6 * Rnd)
		' PRÜFUNG: Ist x = 0?
		' Wenn 20 * Rnd = 0, bzw. kleiner 1 ist, dann 
		' Wird der Zähler (i) um 1 subtrahiert. 
		' Dadurch erhält man dann 8 Zahlen zwischen 1 und 20, und ohne 0
		if x <=1 then 
			i=i-1
			 goto weiter
		End if
		' Wert aus "x" in Zielzelle schreiben
		' Die Adressierung der Zielzelle erfolgt hierdurch:
		' getCellByPosition(14,i)	14 ist die Spalte "O".
		' "i" ist die Zählervariable. Gestartet wird die Zählung bei 3 und endet bei 15
		' Immer daran denken, die Zählung beginnt für Zeilen und Spalte immer bei 0 -->  0,1,2,3...
		' Beispiel: 
		' "A1" = 0,0 --> (Spalte,Zeile)
		' Somit ist "O4" = 14,3 --> (Spalte,Zeile)		
		oCC.ActiveSheet.getCellByPosition(55,i).value= x
weiter:		
	next i

	For i = 3 to 201
		if i = 200 then goto weiter
				y= Int(6 * Rnd)
		if y <=1 then 
			i=i-1
			 goto weiter
		End if
		oCC.ActiveSheet.getCellByPosition(56,i).value= y
weiter:		
	next i


End Sub
macht mir leider auch fehler.

Nach welcher Programiersprache muß ich googeln um mich da weiter einzulesen zu können ?

Nach oben