Sie es mit exponentieller tun könnte oder quadratische Funktionen - habe x deine Zufallszahl, nimm y als die neue Zufallszahl. Dann müssen Sie nur die Gleichung wackeln, bis sie zu Ihrem Anwendungsfall passt. Sprich ich hatte (x^2)/10 + (x/300). Setzen Sie Ihre Zufallszahl ein (als Fließkomma-Form), und erhalten Sie dann das Wort mit Int(), wenn es herauskommt. Also, wenn mein Zufallszahlengenerator von 0 auf 9 geht, habe ich eine 40% ige Chance auf 0 und eine 30% ige Chance auf 1 - 3, eine 20% ige Chance auf 4 - 6 und eine 10% ige Chance auf an 8. Du versuchst im Grunde, eine Art Normalverteilung zu fälschen.
Hier ist eine Vorstellung davon, was es wie in Swift aussehen:
func giveY (x: UInt32) -> Int {
let xD = Double(x)
return Int(xD * xD/10 + xD/300)
}
let ans = giveY (arc4random_uniform(10))
EDIT:
ich nicht ganz klar oben war - was ich meinte, war Sie die Switch-Anweisung mit einer gewissen Funktion ersetzen könnte das würde eine Reihe von Zahlen mit einer Wahrscheinlichkeitsverteilung zurückgeben, die Sie mit Regression unter Verwendung von Wolfram oder etwas herausfinden könnten. Also, für die Frage, die Sie verbunden sind, könnten Sie etwas tun:
import Foundation
func returnLevelChange() -> Double {
return 0.06 * exp(0.4 * Double(arc4random_uniform(10))) - 0.1
}
newItemLevel = oldItemLevel * returnLevelChange()
Damit Funktion gibt eine doppelte irgendwo zwischen -0,05 und 2,1. Das wäre Ihre "x% schlechter/besser als die aktuelle Position". Da es sich jedoch um eine Exponentialfunktion handelt, wird es keine gleichmäßige Verteilung von Zahlen geben. Die arc4random_uniform (10) gibt ein int 0 bis 9, und jeder von denen in einem Doppel wie dies zur Folge hätte:
0: -0.04
1: -0.01
2: 0.03
3: 0.1
4: 0.2
5: 0.34
6: 0.56
7: 0.89
8: 1.37
9: 2.1
Da jede dieser Ints vom arc4random_uniform der zeigt sich die gleiche Chance hat, bekommt man Wahrscheinlichkeiten wie folgt:
40% chance of -0.04 to 0.1 (~ -5% - 10%)
30% chance of 0.2 to 0.56 (~ 20% - 55%)
20% chance of 0.89 to 1.37 (~ 90% - 140%)
10% chance of 2.1 (~ 200%)
Das ist etwas ähnlich zu den Wahrscheinlichkeiten, die andere Person hatte. Nun, für deine Funktion ist es viel schwieriger, und die anderen Antworten sind fast definitiv anwendbarer und eleganter. ABER du könntest es immer noch tun.
Ordne jeden Buchstaben in der Reihenfolge seiner Wahrscheinlichkeit an - vom größten zum kleinsten. Dann erhalten Sie ihre kumulativen Summen, beginnend mit 0, ohne die letzte. (also Wahrscheinlichkeiten von 50%, 30%, 20% wird 0, 0,5, 0,8). Dann multipliziert man sie mit hinreichender Genauigkeit zu ganzen Zahlen (0, 5, 8). Dann plotten Sie sie - Ihre kumulativen Wahrscheinlichkeiten sind Ihre x's, die Dinge, die Sie mit einer gegebenen Wahrscheinlichkeit (Ihre Buchstaben) auswählen möchten, sind Ihre y's. (Sie können natürlich keine tatsächlichen Buchstaben auf der Y-Achse zeichnen, also würden Sie ihre Indizes nur in einem Array darstellen). Dann würden Sie versuchen, dort eine Regression zu finden, und das wäre Ihre Aufgabe. Zum Beispiel jener Zahlen versuchen, bekam ich
e^0.14x - 1
und dieses:
let letters: [Character] = ["a", "b", "c"]
func randLetter() -> Character {
return letters[Int(exp(0.14 * Double(arc4random_uniform(10))) - 1)]
}
returns "ein" 50% der Zeit, "b" 30% der Zeit, und "c" 20 % der ganzen Zeit.Offensichtlich ziemlich umständlich für mehr Buchstaben, und es würde eine Weile dauern, um die richtige Regression herauszufinden, und wenn Sie die Gewichtungen ändern wollten, müssen Sie es manuell tun. Aber wenn Sie tat finden Sie eine schöne Gleichung, die Ihre Werte passierte, wäre die eigentliche Funktion nur ein paar Zeilen lang und schnell.
Wenn Sie ähnliche Fälle haben, können Sie alle ähnlichen Fälle in einem einzigen Fall schreiben, indem Sie einen Komma-Operator angeben. – Amit89
@ Amit89 Sie sind ähnlich, aber nicht identisch. Alle Fälle geben nur einen Wert zurück, geben aber unterschiedliche Werte zurück. – asdf
Die switch-Anweisung sieht elegant zu mir ... –