Arc4random

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Hallo zusammen,

    ich beschäftige mch gerade mit arc4random um zufällige Zahlen zu erzeugen. Das funktioniert auch soweit ganz gut :)

    Meine Frage ist aber: Wie kann ich die Range von:

    var zufallsZahl = arc4random_uniform(__upper_bound: UInt32)
    mit einer anderen Variablen ändern ?

    Z.B.
    var zufallsZahl = arc4random_uniform(20) // erzeugt eine zufällige Zahl zwischen 0 und 20

    Ich möchtge aber gerne die (20) auf eine andere Zahl ändern. Dazu dachte ich folgendes würde funktionieren:

    var rangeZahl = 50
    var zufallsZahl = arc4random_uniform(rangeZahl)

    Das funktioniert aber leider nicht. Mist

    Wie könnte ich das hinbekommen ?

    Danke

    Pivot
    Viele Grüße
    pivot
  • pivot schrieb:

    var rangeZahl = 50
    var zufallsZahl = arc4random_uniform(rangeZahl)

    Das funktioniert aber leider nicht. Mist

    arc4random_uniform() nimmt als Parameter/ Input eine Zahl vom Typ UInt32, also einen unsigned 32 bit integer. Bei var rangeZahl = 50 ist kein Typ angegeben. Swift ist typsicher. Swift muß also wissen, welcher Typ vorliegt. Swift muß den Typ dann errechnen und greift auf den Standart zurück: Int, also signed 64 bit integer.

    UInt32 und Int passen aber nicht zusammen. Also klappt das nicht.

    Lösung: Man gibt explizit den Typ an

    1.)

    Quellcode

    1. let zahl: UInt32 = 50
    2. var randomZahl = arc4random_uniform(zahl)

    oder

    2.)

    Quellcode

    1. let zahl = 50 // Int
    2. var randomZahl = arc4random_uniform(UInt32(zahl))
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?
  • Vielen Dank.

    Ich erhalte bei beiden Varienten die Fehlermeldung "Cannot use instance member 'zahl' within property initializer; property initializers run before 'self' is available" Und das verstehe ich nicht.

    Hier der Code:


    import UIKit


    class ViewController: UIViewController {
    @IBOutlet weak var zahlEins: UILabel!
    @IBOutlet weak var zahlZwei: UILabel!
    @IBOutlet weak var rechenart: UILabel!
    @IBOutlet weak var ergebnisText: UITextField!


    let zahl: UInt32 = 50
    var randomZahl = arc4random_uniform(zahl)


    @IBAction func losButton(_ sender: Any) {
    }

    override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
    }


    }
    Viele Grüße
    pivot
  • pivot schrieb:

    Ich erhalte bei beiden Varienten die Fehlermeldung "Cannot use instance member 'zahl' within property initializer; property initializers run before 'self' is available" Und das verstehe ich nicht.

    Verwende im Editor für Code doch bitte die Code-Tags.^^

    zahl und randomZahl sind in Deinem Beispiel beides Properties, also Eigenschaften der Klasse ViewController. In var randomZahl = arc4random_uniform(zahl) greifst Du bei der Deklarierung der Eigenschaft randomZahl auf eine andere Eigenschaft (zahl) der Klasse zurück. Swift erlaubt den Zugriff auf Eigenschaften eines Typs aus Sicherheitsgründen aber erst nachdem der Typ _vollständig_ initialisiert ist, z.B. durch eine init-Funktion. Du kannst an der Stelle also noch nicht auf die Property zahl zugreifen.

    Das ist ungefähr so, als wenn Du vor der Geburt Deines Kindes schon die Geburtsurkunde ändern möchtest. ;)

    Es gibt mehrere Möglichkeiten. Du könntest z.B. vor var randomZahl = arc4random_uniform(zahl) ein lazy einfügen. Also lazy var randomZahl = arc4random_uniform(zahl). Dadurch wird randomZahl erst beim ersten Aufruf nach der Initialisierung belegt.

    Ich bin mir aber nicht sicher, ob Du das letztendlich willst. Willst Du wirklich eine _einmal_ vergebene Zufallszahl zu einer Eigenschaft Deines ViewControllers machen?
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?
  • matz' Lösungsvorschlag sähe ungefähr so aus:

    Quellcode

    1. import Darwin
    2. class Controler {
    3. let zahl: UInt32 = 50
    4. var randomZahl: UInt32!
    5. func viewDidLoad() {
    6. randomZahl = arc4random_uniform(zahl)
    7. }
    8. }
    Alles anzeigen
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?
  • Puhh, jetzt wird es schwierig für mich...

    Was ich eigentlich will ist, dass der User die Range einer Zufallszahl selbst einstellen kann.

    Ich möchte eine App für meinen Sohn entwickeln, damit er das Ein-Mal-Eins übt. Er findet es total cool, wenn Papa ihm eine App programmiert. :) Und er findet es viel cooler, als wenn ich ihm eine entsprechende App (die es ja x-mal gibt) aus dem Store zur Verfügung stelle.

    Eine entsprechende App zum üben von Multiplikation, Division, Subtraktion und Addition habe ich bereits gemacht. Jedoch kannn man die Range der zufällig erzeugten Zahlen in der App nicht ändern. D.h. im Code gebe ich vor, dass z.B. nur Zahlen von 1 bis 100 bei der addition oder 1 bis 20 bei der multiplikation usw. generiert werden.

    Ich möchte jedoch, dass man im User Interface die Range selber einstellen kann.

    Da dachte ich, ich mach einfach eine Funktion, die es ermöglicht eine Zahl einzugeben, die die Range der Zufallszahl verändert.

    Was liegt da näher, als zu denken: Da mach ich eine Variable mit dem Namen "range = 0" und arc4random (range). Dann könnte ich im UserInterface en Textfeld einbauen, in dem man die entsprechende Zahl der Range eingeben kann und mit einem Action-Button abschickt. Fertig.

    Falsch gedacht - oder ?

    torquato schrieb:

    Verwende im Editor für Code doch bitte die Code-Tags.^^
    Was meinst Du damit ?
    Viele Grüße
    pivot
  • *lach*

    Helikoptereltern schreiben jetzt schon Apps für ihre Kleinen…

    *scnr* :D

    Naja… limit, aka range ist dann halt eine Property, die Du mit dem Eingabefeld synchronisierst, und arc4_random() rufst Du dann jeweils in Deiner Action-Button-Funktion auf…
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?