Multiplikation in einem bestimmten Bereich

  • Allgemein

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Koopakiller.

    Multiplikation in einem bestimmten Bereich

    Hey,

    ich moechte nen kleines Kopfrechenprogramm entwickeln. Jetzt wuerde ich aber gerne Aufgaben zur Multiplikation haben, wo Multiplikator, Multiplikand und Produkt unter einem bestimmten Wert liegen, das Produkt aber die gleiche Zufaelligkeit wie alle andern Zahlen hat. (Wenn man alle Moeglichen Aufgaben zwischen 0 und 10 in Betracht zieht kommt die 0 am meisten als Ergebnis vor, das soll aber nicht so sein.)

    Kann da jemand helfen?

    Dankend, Tobias
    Dann würde ich so vorgehen, das du das Produkt hast und dann durch einen 2. zufälligen Wert teilst. das entstehende ergebnis rundest du dann und multiplizierst es mit der 2. Zahl:

    VB.NET-Quellcode

    1. Dim rnd As New Random()
    2. Dim p As Integer = rnd.Next(100)
    3. '+1 , damit kein /0 entsteht
    4. Dim f2 As Integer = rnd.Next(9) + 1
    5. Dim f1 As Integer = p / f2
    6. p = f1 * f2
    7. Console.WriteLine("{0}*{1}={2}", f1, f2, p)



    PS: Das nennt sich nicht Multiplikator und Multiplikand, sondern das sind Faktoren!
    de.wikipedia.org/wiki/Multiplikation#Namensgebung
    @Artentus
    Noch nie gehöhrt, aber steht auch in Wikipedia :D
    Trotzdem leicht Sinnlos:
    a * b = b * a
    Faktor * Faktor = Faktor * Faktor
    Man kannes drehen. Warum dann bitte soll man selbst in der verallgemeinerung noch dazwischen unterscheiden?
    Multiplikator * Multiplikand = Multiplikand*Multiplikator
    Genauso ist es bei der Addition: Summand + Summand = Summe

    Aber das ist denke ich ein anderes Thema ;)
    Die nennt man auch "erster Summand" und "zweiter Summand" :P
    Und ich habe lieber 1 mal 500 Euro in der Tasche als 500 mal 1 Euro.

    Jedenfall ist deine Methode nicht wirklich zufriedenstellend. Trotz ein bisschen Anpassung sind die Werte (des Multiplikators ;) - also ersten Faktors) ziemlich bescheidend. Das Problem ist, das in hoeheren Bereichen die Moeglichkeiten zu Multiplizieren schwinden.

    Wenn ich mich nicht Irre ist es eine Chance von 50% das ich mal 1 nehme, 25% mal 2, 12,5% mal 3. (korrigiert mich wenns nicht stimmt, aber man siehts ja auch im Test selber das es ne hohe Haeufigkeit hat) Ich sitz schon 3 Stunden davor und mir faellt einfach nicht ein wie alle drei Werte, besonders das Produkt, eine - nach rnd.Next moegliche - hohe Zufaelligkeit haben, aber Trotzdem alle unter dem Wert von z.b. 10 oder 100 liegen.
    Ich habe jetzt nochmal etwas getestet. Die 0 ist zwar auch bei meiner Methode noch immer mit das häufigste, jedoch auch nicht viel häufiger als andere Zahlen. Kannst du ja auch mal testen:

    VB.NET-Quellcode

    1. Sub Main()
    2. Dim rnd As New Random()
    3. Dim dic As New Dictionary(Of Integer, Integer)
    4. For i As Integer = 0 To 100000
    5. Dim p As Integer = rnd.Next(100)
    6. '+1 , damit kein /0 entsteht
    7. Dim f2 As Integer = rnd.Next(9) + 1
    8. Dim f1 As Integer = p / f2
    9. p = f1 * f2
    10. If (dic.ContainsKey(p)) Then
    11. dic(p) += 1
    12. Else
    13. dic.Add(p, 1)
    14. End If
    15. Console.WriteLine("{0}*{1}={2}", f1, f2, p)
    16. Next
    17. 'Sortieren
    18. dic = (From x In dic
    19. Order By x.Key
    20. Select x).ToDictionary(Function(x) x.Key, Function(x) x.Value)
    21. For Each kvp As KeyValuePair(Of Integer, Integer) In dic
    22. Console.WriteLine("{0}" & vbTab & "{1}", kvp.Key, kvp.Value)
    23. Next
    24. Console.ReadKey()
    25. End Sub


    Der größte Fehler ist bspws. jedes mal ein neues Random-Objekt zu erzeugen. Perfekte Zufälligkeit gibts bei Computern nicht.

    Deine Prozentsätze machen für mich auf den ersten Blick keinen richtigen Sinn, denn dann würde ja mit einer wahrscheinlichkeit von 1:2 eine 1 auftauchen und die 10 mit 1:1024.

    Ich gestehe das mein Code bei 3% der Fälle mit 0 als Produkt rechnet, aber da waren auch viele anderen Werte bei fast 3%. Aber einmal mal 0 alle 33 Aufgaben, so schlimm? Dann kann man den Code immernoch abändern, das =0 Aufgaben übersprungen werden.
    Es taucht ja auch mit einer Wahrscheinlichkeit von 1:2, also 50% eine 1 auf.
    Wenn ich jetzt 100 als Wert nehme dann sind alle Divisionen in Zeile 6 ueber 50, was die Haelfte aller Zahlen entspricht, am Ende ergibt f1 also 1. Hatte ja von "Anpassung" gesprochen und diese bestand darin das alle Faktoren UND das Produkt die GLEICHE obere Grenze von z.b. 100 haben. Bei deinem Beispielcode ist es aber nicht so, weil f2 nur zwischen 1 und 9 ist.

    Ich arbeite mal mit deinem zweiten Beispiel und melde mich bei Problemen, ansonsten bedanke ich mich :)

    Edit: In deinem zweiten Beispiel aendert es sich ja auch nicht. Ich habe zwar noch nicht mit sowas (Dictionary) gearbeitet (Ich bin eigentlich Chemiker und programmier nur Hobbyweise das wodrauf ich gerade Lust habe :D) aber das aendert ja nichts an der Haeufigkeit der eins, oder?
    Ich denke mal das ich jetzt deine Prozente verstanden habe, so macht das Sinn :)

    Der 2. Code zählt blos welches Ergebnis wie oft kommt und gibt das dann aus. Daher habe ich auch meine 3%.

    Ansonsten finde ich die Werte schon ziehmlich zufällig. Wirklich viel besser wirds glaube ich nicht, zumindest nicht ohne sich "Tod" zu programmieren.
    Habe mir jetzt gedacht, das ich einfach alle Teiler bestimme und daraus zufaellig einen auswaehle. Das rechne ich dann mit Modulo halt aus welche Teiler eine Zahl hat und speicher diese in einer Liste. Kann das bei Zahlen bis zu 50000 Performanceprobleme geben?
    Grundsätzlich kann es immer probleme geben, aber 50000*8 Bytes*3 Zahlen =1,2MByte. Dabei sollte es keine Probleme geben. Wenn die CPU bei so etwas nicht hinterherkommt, dann gute Nacht :D
    Also sollte es keine Probleme geben. Ich arbeite beim testen auch gerne mit Listen mit mal schnell 1000000 Elementen.