|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
а в релизном трейсы не работают
|
|
|||||
Регистрация: Mar 2007
Сообщений: 319
|
выводи в TextField
|
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
не знаю у кого как, но у меня в релизном кажет:
Цитата:
package { import flash.display.Sprite; import flash.events.Event; import flash.text.TextField; /** * ... * @author */ public class Main extends Sprite { private var tf:TextField; public function Main() { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { tf = new TextField(); removeEventListener(Event.ADDED_TO_STAGE, init); var test:TestBitmap = new TestBitmap(); var res:Object; res = test.test(); addChild(test); for (var s:String in res) tf.appendText(s + ":" + res[s] + "\n"); addChild(tf); } } } package { /** * ... * @author */ import flash.display.*; public class TestBitmap extends Sprite { public function TestBitmap() { super(); } function test():Object { var res:Object = {}; res.test1 = test1(); res.test2 = test2(); res.test3 = test3(); return res; } private function test1():Number { var seed:int = Math.random() * 123456789; function random(min:Number = 0.0, max:Number = 1.0):Number { seed = (seed * 9301 + 49297) % 233280; var rnd:Number = seed / 233280; return min + rnd * (max - min); } var res:Number = (new Date()).getTime(); var bitmapData:BitmapData = new BitmapData(200, 200, false, 0xffffff); for (var i:int = 0; i < 100000; i++) { bitmapData.setPixel(random(0, 200), random(0, 200), random(0, 0xffffff)); } //trace("test1", (new Date()).getTime() - ts); res = new Date().getTime() - res; var bitmap:Bitmap = new Bitmap(bitmapData); bitmap.x = 0; bitmap.y = 0; addChild(bitmap); return res; } private function test2():Number { var seed:int = Math.random() * 123456789; function random(max:int):Number { seed = (seed * 16807) % 0x7fffffff; return seed % max; } var bitmapData:BitmapData = new BitmapData(200, 200, false, 0xffffff); var res:Number = (new Date()).getTime(); for (var i:int = 0; i < 100000; i++) { bitmapData.setPixel(random(200), random(200), random(0xffffff)); } res = new Date().getTime() - res; var bitmap:Bitmap = new Bitmap(bitmapData); bitmap.x = 200; bitmap.y = 0; addChild(bitmap); return res; } private function test3():Number { var bitmapData:BitmapData = new BitmapData(200, 200, false, 0xffffff); var res:Number = (new Date()).getTime(); for (var i:int = 0; i < 100000; i++) { bitmapData.setPixel(Math.random() * 200, Math.random() * 200, Math.random() * 0xffffff); } res = new Date().getTime() - res; var bitmap:Bitmap = new Bitmap(bitmapData); bitmap.x = 0; bitmap.y = 200; addChild(bitmap); return res; } } } вывод - нефиг изобретать велосипед |
|
|||||
Регистрация: Mar 2007
Сообщений: 319
|
есть такие задачи, где должен быть детерминированный рандом, которые нельзя решить нативным рандомом. например клиент-серверная симуляция (бой в RTS/TBS), где с идентичными входными данными должен быть одинаковых результат
|
|
|||||
Регистрация: Mar 2007
Сообщений: 319
|
Нашел еще один вариант:
private static var seed1:int = getTimer(); public static function random1 ():Number { seed1 = (seed1 * 214013 + 2531011) % 0x7fffffff; return seed1 / 0x7fffffff; } private static var seed:uint = getTimer(); public static function random3 ():Number { var aNum:uint = (seed = ((seed & 1) ? ((seed >> 1) ^ 0x48000000) : (seed >> 1))) * 71; aNum = ((aNum << 13) ^ aNum) - (aNum >> 21); var iResult:uint = (aNum * int(aNum * aNum * 15731 + 789221) + 1376312589) & 0x7fffffff; iResult += aNum; iResult = ((iResult << 13) ^ iResult) - (iResult >> 21); return (iResult & 0x7fffffff) / (0x7fffffff + 1.0); } [SWF(width = "400", height = "500")] public class Test2 extends Sprite { private var text:TextField; public function Test2 () { super(); text = new TextField(); text.y = 400; text.height = 100; addChild(text); test1(); test2(); test3(); test4(); } private static var seed1:int = getTimer(); public static function random1 ():Number { seed1 = (seed1 * 214013 + 2531011) % 0x7fffffff; return seed1 / 0x7fffffff; } private function test1 ():void { var bitmapData:BitmapData = new BitmapData(200, 200, false, 0xffffff); var time:int = getTimer(); for (var i:int = 0; i < 100000; i++) { bitmapData.setPixel(random1() * 200, random1() * 200, random1() * 0xffffff); } text.appendText("test1 " + (getTimer() - time) + "\n"); var bitmap:Bitmap = new Bitmap(bitmapData); bitmap.x = 0; bitmap.y = 0; addChild(bitmap); } private static var seed2:int = getTimer(); public static function random2 ():Number { seed2 = (seed2 * 16807) % 0x7fffffff; return seed2 / 0x7fffffff; } private function test2 ():void { var bitmapData:BitmapData = new BitmapData(200, 200, false, 0xffffff); var time:int = getTimer(); for (var i:int = 0; i < 100000; i++) { bitmapData.setPixel(random2() * 200, random2() * 200, random2() * 0xffffff); } text.appendText("test2 " + (getTimer() - time) + "\n"); var bitmap:Bitmap = new Bitmap(bitmapData); bitmap.x = 200; bitmap.y = 0; addChild(bitmap); } private static var seed3:uint = getTimer(); public static function random3 ():Number { var aNum:uint = (seed3 = ((seed3 & 1) ? ((seed3 >> 1) ^ 0x48000000) : (seed3 >> 1))) * 71; aNum = ((aNum << 13) ^ aNum) - (aNum >> 21); var iResult:uint = (aNum * int(aNum * aNum * 15731 + 789221) + 1376312589) & 0x7fffffff; iResult += aNum; iResult = ((iResult << 13) ^ iResult) - (iResult >> 21); return (iResult & 0x7fffffff) / (0x7fffffff + 1.0); } private function test3 ():void { var bitmapData:BitmapData = new BitmapData(200, 200, false, 0xffffff); var time:int = getTimer(); for (var i:int = 0; i < 100000; i++) { bitmapData.setPixel(random3() * 200, random3() * 200, random3() * 0xffffff); } text.appendText("test3 " + (getTimer() - time) + "\n"); var bitmap:Bitmap = new Bitmap(bitmapData); bitmap.x = 0; bitmap.y = 200; addChild(bitmap); } private function test4 ():void { var bitmapData:BitmapData = new BitmapData(200, 200, false, 0xffffff); var time:int = getTimer(); for (var i:int = 0; i < 100000; i++) { bitmapData.setPixel(Math.random() * 200, Math.random() * 200, Math.random() * 0xffffff); } text.appendText("test4 " + (getTimer() - time) + "\n"); var bitmap:Bitmap = new Bitmap(bitmapData); bitmap.x = 200; bitmap.y = 200; addChild(bitmap); } } |
|
|||||
Lorem ipsum
|
Во-первых, не мой, а используемый мною в моих проектах.
Во-вторых, лучше, например, в деле перемешивания небольших массивов. Натив мешает отвратительно. В-третьих, лучше уже хотя бы потому, что имеет повторяемость при одном и том же seed (это ты и сам указал чуть позже, да) Такова практика. Алгоритмы "идентичные нативному" беру на карандаш. Но опять же, как раз во втором пункте они работают хуже, так что я даже рад тому, как мешает выбранный мной когда-то первый вариант. Годная тема поднялась! Много полезного ) топикстартер, поди, в шоке!
__________________
Поймай яблоко 2! |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
Цитата:
|
|
|||||
Lorem ipsum
|
Требование: "максимально рассыпчато" перемешать массив из N нулей и M единиц.
– Вариант, который выбрал я и который кочует у меня из AS в JS — отлично! – Нативный рандом — кол!
__________________
Поймай яблоко 2! |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
а ну это критерий нравится/не нравится, его не проверишь
|
|
|||||
Lorem ipsum
|
Нет. Это критерий минимальной длины неперемешанных рядов единиц и нулей.
__________________
Поймай яблоко 2! |
Часовой пояс GMT +4, время: 21:33. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|