【问题标题】:Actionscript 3 , generating random numbers and placing in byte array, faster?Actionscript 3,生成随机数并放入字节数组,更快吗?
【发布时间】:2017-08-07 18:56:35
【问题描述】:

我正在尝试生成随机字节的大字节数组。使用下面的代码,我可以在大约 4 秒内生成 1000 万个随机字节并放入一个字节数组中。生成需要 2 秒,放置在阵列上需要 2 秒。

for (var i:Number = 0; i < reqLength; i++){
    rnd = Math.random() * 255;
    randomBytes.writeByte(rnd);
}

是否存在更快的方法?

我正在生成 ints,因为我正在创建扩展 ASCII 字符的字节数组。

【问题讨论】:

    标签: loops actionscript-3 flash random byte


    【解决方案1】:

    经过一些调整,我将它从 4 秒调到了 0.5 秒。

    var aBytes:ByteArray = new ByteArray;
    
    // Set the final ByteArray length prior to filling it.
    // It saves about 30% of elapsed time.
    aBytes.length = 10000000;
    
    // Write 2 500 000 x 4 byte unsigned ints instead of 10 000 000 x 1 bytes.
    // You'll get 4 times less operations thus it is about 4 times faster.
    for (var i:int = 0; i < 2500000; i++)
    {
        // Don't use local variable = less operations.
        aBytes.writeUnsignedInt(Math.random() * uint.MAX_VALUE);
    }
    

    附:还有另一个有趣的选项,工作得更快,比如 100 毫秒:

    var aRaster:BitmapData = new BitmapData(5000, 500, true, 0x000000);
    var aBytes:ByteArray = new ByteArray;
    
    aRaster.noise(256 * Math.random());
    aRaster.copyPixelsToByteArray(aRaster.rect, aBytes);
    

    【讨论】:

    • 您非常接近(或者是)正确答案。 writeUnsignedByte 也可以吗?我认为 Asker 想要每个字节的随机单个值(0-255 范围)。 "extended ASCII chars" 使用 8 位,因此每个位都是一个字节(他们使用的词 "ints" 可能表示非分数而不是每个值 4 个字节? )。
    • @VC.One 这里的操作总量是一个关键,10M x writeUnsignedByte 会比 2.5M x writeUnsignedInt 慢 4 倍左右。我很肯定 Math.random() * uint.MAX_VALUE 将产生 4 x 8 位随机字节(唯一的例外是 0xFFFFFFFF,因为 Math.random()
    • @VC.One 但有了噪声解决方案,这一切都变得无关紧要了。
    • 如果random()算法给出一个5,那么writeUnsignedInt将给出不等于4个唯一随机字节的00 00 00 05。它的算法给出了 1400(来自 uint.MAX_VALUE),那么它超出了最大 256 个 ASCII 范围。看看这个ASCII chart,这就是为什么每个字节必须对应一个ASCII字符,在0-255范围内。因此,Asker 使用了Math.random() * 255;... 他们关于 INTS 的观点是,他们不希望像 1.777445 这样的随机非整数值作为字节值(必须是整数/整数)。
    • @VC.One 产生 00 00 00 FF 或以下的概率是 1 / 0x1000000,我猜这非常接近产生三个后续零的概率,滚动 0 到 255。
    猜你喜欢
    • 2012-08-12
    • 2018-09-19
    • 2015-04-14
    • 2020-01-04
    • 2023-03-12
    • 2020-07-16
    • 1970-01-01
    • 2023-03-22
    • 2011-06-14
    相关资源
    最近更新 更多