我想退后一步。我原来的问题在这篇文章的底部供参考。
我正在写一个单词猜谜游戏,想要一个方法: 1.给定2到10个字符的单词长度,随机生成一个有效的英语单词进行猜测 2.给出2到10个字符的猜测,确保它是一个有效的英文单词。 我创建了一个9个对象的向量,每个字长一个,动态创建172000 属性/值对使用单词列表中的单词命名属性并将其值设置为true。内循环是:
for (i = 0; i < _WordCount[wordLength] - 2; i)
{
_WordsList[wordLength]["" + _WordsVector[wordLength][i++]] = true;
}
要验证单词,如果有效,则以下查找返回true:
function Validate(key:String):Boolean
{
return _WordsList[key.length - 2][key]
}
我将它们从向量转移到对象,以利用属性的哈希查找。没有看过这一切都需要多少记忆,但它是一项有用的学习练习。 我只是不确定如何从一个对象中随机选择一个属性。我正在考虑通过生成1000 000个单词并分析分布的统计数据来验证我选择的任何方法。 所以我想我的问题应该首先是我最好使用其他方法,例如将列表保存在向量中并每次进行搜索?
原始问题
新手第一个问题:
我读了一个帖子,说for ... in中的遍历顺序是由哈希表决定的,并且是随机的。
我正在寻找一种在对象中随机选择属性的好方法。 for ..中的第一个元素是遍历属性,还是迭代中的随机第n个元素是真正随机的。我想确保访问给定财产的概率几乎相等。对象具有大约100到20000个属性。其他方法?
感谢。
答案 0 :(得分:0)
查看您在编辑过的问题中描述的情景,我建议您使用Vector.<String>
和地图对象。
您可以将所有键存储在矢量中并将它们映射到对象中,然后您可以在矢量中选择一个随机数字键,并将结果用作地图对象中的键。
为清楚起见,请看一下这个简单的例子:
var keys:Vector.<String> = new Vector.<String>();
var map:Object = { };
function add(key:String, value:*):void
{
keys.push(key);
map[key] = value;
}
function getRandom():*
{
var randomKey = keys[int(Math.random() * keys.length)];
return map[randomKey];
}
你可以像这样使用它:
add("a", "x");
add("b", "y");
add("c", "z");
var radomValue:* = getRandom();
使用Object
代替String
您可以存储字符串中包含字符串的对象,而不是存储字符串, 类似的东西:
public class Word
{
public var value:String;
public var length:int;
public function Word(value:String)
{
this.value = value;
this.length = value.length;
}
}
将此对象用作值而不是字符串,但您需要将地图对象更改为Dictionary:
var map:Dictionary = new Dictionary();
function add(key:Word, value:*):void
{
keys.push(key);
map[key] = value;
}
这样你就不会复制每一个单词(但会有一点类开销)。