extends Node
## 键为随机物品,值为对应的权值,暂时不支持小数(提示:可以用类似链表解决哈希冲突方法实现)
@export var item_chance_map : Dictionary = {
"a" : 1,
"b" : 5,
"c" : 50,
"d" : 55
}
## 哈希空间
var hash_item_map : Dictionary
func _ready() -> void:
initiate_chance_hash()
## 测试代码,随机10000次
var item_count = {}
for i in 10000:
var rand_item = roll_for_item()
if item_count.has(rand_item):
item_count[rand_item] = item_count[rand_item] + 1
else:
item_count[rand_item] = 0
print(item_count)
## 关键代码1:往哈希空间里扔飞镖
func roll_for_item():
return hash_item_map[randi() % hash_item_map.size()]
## 关键代码2:按照权值大小往哈希空间里划分地盘
func initiate_chance_hash():
hash_item_map.clear()
var hash_index = 0
for item in item_chance_map.keys():
## 作业:在这里实现小数点支持(虽然小数点没有性能优势)
var hash_space = floor(item_chance_map.get(item))
## 划分哈希地盘
for i in hash_space:
hash_item_map[hash_index] = item
hash_index += 1
======= 测试===================
参数:
(注意直接打印dictionary是乱序的)