Τυχαία Δημιουργία Επιστολές Σύμφωνα με την συχνότητα χρήσης τους;

ψήφοι
10

Πώς μπορώ να δημιουργήσει τυχαία γράμματα ανάλογα με τη συχνότητα χρήσης τους στην κοινή ομιλία;

Κάθε ψευδο-κώδικα εκτιμηθεί, αλλά μια εφαρμογή σε Java θα ήταν φανταστικό. Διαφορετικά, απλά ένα σακί προς τη σωστή κατεύθυνση θα ήταν χρήσιμη.

Σημείωση: Δεν χρειάζεται να δημιουργήσει τις συχνότητες χρήσης - είμαι σίγουρος ότι μπορώ να δούμε ότι μέχρι αρκετά εύκολα.

Δημοσιεύθηκε 27/01/2010 στις 21:11
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
11

Ένας γρήγορος τρόπος για να το κάνει θα ήταν να δημιουργήσει μια λίστα των γραμμάτων, όπου κάθε γράμμα εμφανίστηκε στον κατάλογο σύμφωνα με τη συχνότητά της. Ας πούμε, αν το «e» χρησιμοποιήθηκε 25,6% του χρόνου, και η λίστα σας είχε μήκος 1000, θα έχει 256 «e» s.

Στη συνέχεια, θα μπορούσατε απλά να επιλέξετε τυχαία σημεία από τη λίστα με τη χρήση (int) (Math.random() * 1000)για την παραγωγή τυχαίων αριθμών μεταξύ 0 και 999.

Απαντήθηκε 27/01/2010 στις 21:14
πηγή χρήστη

ψήφοι
18

Υποθέτω ότι μπορείτε να αποθηκεύσετε τις συχνότητες και αριθμούς κινητής υποδιαστολής μεταξύ 0 και 1 που συνολικά να 1.

Πρώτα θα πρέπει να προετοιμάσει ένα πίνακα αθροιστικών συχνοτήτων, δηλαδή το άθροισμα των συχνοτήτων του εν λόγω εγγράφου και όλων των γραμμάτων ενώπιόν του.

Για την απλοποίηση, αν ξεκινήσετε με αυτή την κατανομή συχνοτήτων:

A  0.1
B  0.3
C  0.4
D  0.2

Το τραπέζι σας αθροιστική συχνότητα θα είναι:

A  0.1
B  0.4 (= 0.1 + 0.3)
C  0.8 (= 0.1 + 0.3 + 0.4)
D  1.0 (= 0.1 + 0.3 + 0.4 + 0.2)

Τώρα παράγει έναν τυχαίο αριθμό μεταξύ 0 και 1 και να δούμε πού σε αυτόν τον κατάλογο που βρίσκεται αριθμό. Επιλέξτε το γράμμα που έχει τη μικρότερη αθροιστική συχνότητα μεγαλύτερη από τυχαίο αριθμό σας. Μερικά παραδείγματα:

Ας πούμε ότι τυχαία πάρει 0.612. Αυτό βρίσκεται μεταξύ 0,4 και 0,8, δηλαδή μεταξύ Β και C, έτσι θα επιλέξετε C.

Αν τυχαίος αριθμός σας ήταν 0.039, που έρχεται πριν από 0,1, δηλαδή πριν από την Α, οπότε επιλέξτε Α

Ελπίζω ότι έχει νόημα, αλλιώς μη διστάσετε να ζητήσετε διευκρινήσεις!

Απαντήθηκε 27/01/2010 στις 21:20
πηγή χρήστη

ψήφοι
4

Δεν έχει ακόμη και μια ψευδο-κώδικα, αλλά μια πιθανή προσέγγιση είναι η εξής:

Ας Ρ1, Ρ2, ..., pk είναι οι συχνότητες που θέλετε να ταιριάζουν.

  1. Υπολογίστε τις σωρευτικές συχνότητες: p1, p1 + p2, p1 + p2 + p3, ..., 1
  2. Δημιουργήστε μια τυχαία ομοιόμορφη (0,1) x αριθμό
  3. Ελέγξτε ποια διάστημα των σωρευτικών συχνότητες χ ανήκει στην αλυσίδα: αν είναι μεταξύ, ας πούμε, p1 + .. + ΡΙ και p1 + ... + ΡΙ + p (i + 1), τότε η έξοδος ο (ί + 1) st επιστολή

Ανάλογα με το πώς θα εφαρμόσουν το διάστημα, το εύρημα, η διαδικασία είναι συνήθως πιο αποτελεσματική εάν τα P1, P2, ... κατατάσσονται κατά φθίνουσα σειρά, γιατί θα βρείτε συνήθως το χρονικό διάστημα που περιέχει x νωρίτερα.

Απαντήθηκε 27/01/2010 στις 21:20
πηγή χρήστη

ψήφοι
5

Αυτό που θα κάνουμε είναι να αναβαθμίσουν τις σχετικές συχνότητες και αριθμούς κινητής υποδιαστολής, έτσι ώστε το άθροισμά τους είναι 1,0. Στη συνέχεια, θα δημιουργήσει μια σειρά από τα σωρευτικά σύνολα ανά γράμμα, δηλαδή τον αριθμό που πρέπει να συμπληρωθεί για να πάρει αυτό το γράμμα και όλα αυτά τα «κάτω» της. Ας υποθέσουμε ότι η συχνότητα του Α είναι 10%, το b είναι 2% και το ζ είναι 1%? Στη συνέχεια το τραπέζι σας θα είναι κάπως έτσι:

0.000 A ; from 0% to 10% gets you an A
0.100 B ; above 10% is at least a B
0.120 C ; 12% for C...
...
0.990 Z ; if your number is >= 99% then you get a Z

Στη συνέχεια θα δημιουργήσετε μόνοι σας ένα τυχαίο αριθμό μεταξύ 0.0 και 1.0 και να κάνουμε μια δυαδική αναζήτηση στον πίνακα για τον πρώτο αριθμό μικρότερο από τυχαίο αριθμό σας. Στη συνέχεια, επιλέξτε το γράμμα στη θέση αυτή. Εγινε.

Απαντήθηκε 27/01/2010 στις 21:23
πηγή χρήστη

ψήφοι
2

Χρησιμοποιώντας ένα δυαδικό δέντρο σας δίνει ένα ωραίο, καθαρό τρόπος για να βρείτε τη σωστή είσοδο. Εδώ, μπορείτε να ξεκινήσετε με ένα frequencyχάρτη, όπου τα πλήκτρα είναι τα σύμβολα (αγγλικά γράμματα), και οι τιμές είναι η συχνότητα εμφάνισής τους. Αυτό γίνεται ανεστραμμένο, και NavigableMapδημιουργείται όταν τα πλήκτρα είναι αθροιστική πιθανότητα, και οι τιμές είναι σύμβολα. Αυτό καθιστά την αναζήτηση εύκολη.

  private final Random generator = new Random();

  private final NavigableMap<Float, Integer> table = 
    new TreeMap<Float, Integer>();

  private final float max;

  public Frequency(Map<Integer, Float> frequency)
  {
    float total = 0;
    for (Map.Entry<Integer, Float> e : frequency.entrySet()) {
      total += e.getValue();
      table.put(total, e.getKey());
    }
    max = total;
  }

  /** 
   * Choose a random symbol. The choices are weighted by frequency.
   */ 
  public int roll()
  {
    Float key = generator.nextFloat() * max;
    return table.higherEntry(key).getValue();
  }
Απαντήθηκε 27/01/2010 στις 22:10
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more