【问题标题】:Randomly selecting an object property随机选择对象属性
【发布时间】:2013-04-19 06:12:11
【问题描述】:

我想应该退后一步。我最初的问题在这篇文章的底部供参考。

我正在写一个猜词游戏,并想要一种方法: 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 中的遍历顺序是由哈希表确定的,并且看起来是随机的。

我正在寻找一种随机选择对象中的属性的好方法。 a for .. 中的第一个元素是否会遍历属性,或者迭代中的随机第 n 个元素是真正随机的。我想确保访问给定属性的概率大致相等。对象具有大约 100 到 20000 个属性。其他方法?

谢谢。

【问题讨论】:

  • 你如何组织你的财产?还有为什么你需要一个随机的?如果它是一个舞台参考 - 它也是一个属性怎么办?

标签: actionscript-3 object random properties selection


【解决方案1】:

看看您在编辑后的问题中描述的场景,我建议使用 Vector.&lt;String&gt; 和您的地图对象。

您可以将所有键存储在向量中并将它们映射到对象中,然后您可以在向量中选择一个随机数字键并将结果用作映射对象中的键。

为了清楚起见,看一下这个简单的例子:

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;
}

这样你就不会重复每个单词(但会有一点类开销)。

【讨论】:

  • 嗨 NemoStein 感谢您的详细回复。我认为你的建议或多或少是我现在所拥有的。我用来创建 _WordsList 对象的 2D _WordsVector 包含 9 个字符串向量,每个长度为 2-10。因为我有 172000 个单词,大约需要 1.7Mb,所以我想尽可能避免保留 2 个单词的副本。创建参数时,它看起来像是制作了单词的副本。我错过了什么吗?
  • @user3657,我修改了答案。
猜你喜欢
  • 2011-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多