1, Probability list + sample list
Task description: we often have a probability list and a sample list to represent the probability that each sample is selected, and in the probability list, the sum of the probabilities is 1. For example, [0.7, 0.2, 0.1] and ['iron man', 'Captain America', 'Thor'], the elements in the two lists correspond one by one; Moreover, the two lists jointly indicate that 'iron man' has a probability of 0.7 selected, 'Captain America' has a probability of 0.2 selected and 'Thor' has a probability of 0.1 selected. Our purpose is to sample ['iron man', 'Captain America' and 'Thor' through discrete probability distributions such as [0.7, 0.2 and 0.1], and only one sample (of course, multiple samples can be taken).
In fact, such tasks can be implemented in a fairly simple way in Python. Please see my code for details.
code
import random # input: probability distribution and correspondence list_probability = [0.005, 0.015, 0.08, 0.25, 0.3, 0.25, 0.08, 0.015, 0.005] list_player_role = ['Black widow', 'Spider-Man', 'The Incredible Hulk', 'Thor', 'Iron Man', 'Dr. strange', 'Captain America', 'panther', 'Eagle eye'] # sampling result = random.choices(list_player_role, weights=list_probability, k=1)[0] # output: sampling one by probability distribution print(result) # check the sampling whether is following the probability distribution or not frequency = [0, 0, 0, 0, 0, 0, 0, 0, 0] trying_times = 100000 for i in range(trying_times): result = random.choices(list_player_role, weights=list_probability, k=1)[0] if result == list_player_role[0]: frequency[0] += 1 elif result == list_player_role[1]: frequency[1] += 1 elif result == list_player_role[2]: frequency[2] += 1 elif result == list_player_role[3]: frequency[3] += 1 elif result == list_player_role[4]: frequency[4] += 1 elif result == list_player_role[5]: frequency[5] += 1 elif result == list_player_role[6]: frequency[6] += 1 elif result == list_player_role[7]: frequency[7] += 1 elif result == list_player_role[8]: frequency[8] += 1 else: raise Exception('There is something wrong in sampling...') for i in range(len(frequency)): print('Role:%s\t probability: %.3f\t frequency: %d/%d=%.4f' % (list_player_role[i], list_probability[i], frequency[i], trying_times, frequency[i]/trying_times))
output
Iron Man
Role: Black Widow Probability: 0.005 Frequency: 489 / 100000 = 0.0049
Role: spider man Probability: 0.015 Frequency: 1558 / 100000 = 0.0156
Role: hulk Probability: 0.080 Frequency: 8011 / 100000 = 0.0801
Role: Thor Probability: 0.250 Frequency: 25094 / 100000 = 0.2509
Role: Iron Man Probability: 0.300 Frequency: 29957 / 100000 = 0.2996
Role: Dr. strange Probability: 0.250 Frequency: 24958 / 100000 = 0.2496
Role: Captain America Probability: 0.080 Frequency: 7867 / 100000 = 0.0787
Role: Panther Probability: 0.015 Frequency: 1551 / 100000 = 0.0155
Role: eagle eye Probability: 0.005 Frequency: 515 / 100000 = 0.0052
It can be seen that each frequency in the output result is close to its corresponding probability, which shows that the sampling process does follow the probability distribution specified by us.
2, Probability list only
Task description: do not specify a sample list, only a probability list, and then output an index in the probability list after sampling. For example, if you input [0.7, 0.2, 0.1] and output 1, then 1 indicates that the probability of acquisition is 0.2. If the output is 2, it indicates that the probability of acquisition is 0.1; If the output is 0, it means that the probability of acquisition is 0.7.
code
import random # input: probability distribution and correspondence list_probability = [0.005, 0.015, 0.08, 0.25, 0.3, 0.25, 0.08, 0.015, 0.005] # sampling index = list(range(len(list_probability))) probability_index = random.choices(index, weights=list_probability, k=1)[0] # output: sampling one by probability distribution print(probability_index)
output
5
The above sampling process is only tested on the list in Python. It is reasonable that open source libraries such as numpy and pytorch will also have corresponding implementation methods.
3, Reference
Choose element(s) from List with different probability in Python