#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Tue Oct 25 11:28:55 2022 @author: mk """ import numpy as np def random_select(items, weights): """ items είναι μια μη κενή λίστα από αντικείμενα (αριθμούς, strings, ή ό,τι άλλο) weights είναι μια λίστα, ίσου μήκους με την items, από μη αρνητικούς αριθμούς με άθροισμα 1 Η συνάρτηση αυτή επιστρέφει ένα απά τα στοιχεία της λίστας items με πιθανότητα το αντίστοιχο βάρος στη λίστα weights Η μόνη συνάρτηση τυχαίων αριθμών που χρησιμοποιεί είναι η numpy.random.uniform() η οποία επιστρέφει ένα τυχαίο αριθμό στο [0, 1] με ομοιόμορφη κατανομή. """ N = len(items) s = (N+1)*[0] s[0] = 0 # Στη θέση s[i] έχουμε το άθροισμα των weights[j] για j=0 έως i-1 # Έχουμε έτσι s[0] = 0, s[N] = 1. # Φανταστείτε τα μήκη weights[0],...,weights[N-1] το ένα δίπλα στο άλλο # να συμπληρώνουν το διάστημα [0, 1]. for i in range(1, N+1): s[i] = s[i-1]+weights[i-1] # Πετάμε ένα τυχαίο σημείο x στο [0, 1] και επιστρέφουμε σε ποιο διάστημα πέσαμε. x = np.random.uniform() i=0 while s[i+1]<=x: # Εδώ ψάχνουμε να βρούμε σε ποιο διάστημα ανήκει το x i += 1 return items[i] print(random_select(["a", "b", 1, 2, 3], [0.2, 0.3, 0.3, 0.1, 0.1]))