Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Массив из уникальных случайных чисел. (http://www.flasher.ru/forum/showthread.php?t=118357)

Alexsas 21.11.2008 13:54

Массив из уникальных случайных чисел.
 
Добрый день.
Я тут запутался. Хочу чтобы добрые люди показали выход.

Требуется в массив из ста элементоа загнать числа от одного до ста, но чтобы они не повторялись среди элементов массива.

Знаю задача простая, но в ней погряз. Вроде бы принцып прост.
Сгенерил число. Побежал по элементам если встретил, генеришь снова, если нет следующий.
Но выстроить в грамотный код немогу.

iNils 21.11.2008 14:02

1. Сгенерировать временный массив Temp чисел 1-100
2. В цикле брать случайное число R в пределах длины Temp.
3. Взять элемент с индексом R из Temp, поместить значение элемента в массив случайных чисел Rand и удалить элемент R из Temp (длинна массива изменится). И так до конца цикла.

Alexsas 21.11.2008 14:11

Спасибо!

Irradiance 21.11.2008 14:21

Код AS3:

trace (getRandomIntArray(100));
 
function getRandomIntArray (len:int):Array {
  var A:Array = [];
  var i:int;
  var found:Boolean = false;
  var un:int;
 
  while (A.length != len) {
    un = Math.random()*len;
        found = false;
    for (i = 0; i < A.length; i++) {
        if (A[i] == un) {
          found = true;
          break;
        }
    }
    if (!found) A.push(un);
  }
 
  return A;
}

Есть способ уменьшить "холостые" генерации случайного числа. Заранее создать массив 1 ... N, и пермешать его. Работает в два раза быстрее, но предлагаю вам подумать об этом самостоятельно.

Fernando Costa 21.11.2008 14:59

вот вам вариант без массива(генерация псевдослучайной последовательности):

Код AS3:

package  {
        /**
        * ...
        * @author Anton Bodrichenko
        * @usage 
        *                        Utils.numRandomSeed = Math.floor(Math.random()*200);
        *                        trace(Utils.getRandomValue(52));
        *                        trace(Utils.getRandomValue(52));
        *                        trace(Utils.getRandomValue(52));
        *
        */

        public class Utils
        {
                private static const A:int = 3423313;
                private static const C:int = 2435;
                //private static var numSeedCnt:int = 0;
                public static var numRandomSeed:int;
 
                public function Utils()
                {
 
                }
                public static function getRandomValue($maxvalue:int):int {
                        numRandomSeed = (numRandomSeed*A)%2147352576;
                        var result:int = (Math.floor((numRandomSeed*$maxvalue)/C))%$maxvalue;
                        return (result);
                }
        }
 
}


iNils 21.11.2008 15:13

Цитата:

Сообщение от Fernando Costa (Сообщение 778786)
вот вам вариант без массива(генерация псевдослучайной последовательности)

И как с помощью этого заполнить массив от 1 до 100?

Fernando Costa 21.11.2008 16:27

Код AS3:

var arr:Array = ["a","b","c","d","e","f","g","h","i","j"];
var numRandom:int;
var saveStr:String;
 
Utils.numRandomSeed = 5;
for (var i:int = 0; i < arr.length; i++) {
        saveStr = arr[i];
        numRandom = Utils.getRandomValue(arr.length);
        arr[i] = arr[numRandom];
        arr[numRandom] = saveStr;
}
trace(arr);

весь смысл в том, что при указанном значении Utils.numRandomSeed массив каждый раз сортируется одинаково

d4lt 25.11.2008 11:18

Обычный вопрос на собеседовании, который решается и реализуется минуты за 3.
Алгоритм тут простой, нужно:
1. Сгенерировать массив из 100 последовательных чисел.
2. Брать первый элемент массива, генерить случайное число от 1 до 100, и менять местами первый элемент с элементом со случайно сгенерированным номером, и так далее.
И не нужно 2-х массивов. Не нужно изобретать свои алгоритмы генерации случайных чисел.

mult2002 09.12.2008 12:11

Код:

temp = new Array();
for (i=1;i>100;i++) {
temp.push (i);
trace (temp[i]);
}
deck = new Array ();
while (temp.length > 0) {
r = int(Math.random()*temp.length);
deck.push(temp[r]);
temp.splice(r,1);
                }
trace (deck);


iNils 09.12.2008 12:16

mult2002, для кода нужно использовать теги форматирования кода.


Часовой пояс GMT +4, время: 00:51.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.