03.12.2014, 23:47
|
Профессор
|
|
Регистрация: 20.01.2014
Сообщений: 150
|
|
Как заполнить массив не повторяющимися случайными числами?
Как заполнить массив не повторяющимися случайными числами?
Пробовал так
<script>
ArrRandomX= Array(0,1);
RandomX= Math.round(Math.random()*2);
top:
for (i=0; i<ArrRandomX.length; i++)
if (ArrRandomX[i] == RandomX)
{
RandomX = Math.round(Math.random()*2);
break top;
}
ArrRandomX[ArrRandomX.length]= RandomX;
alert(ArrRandomX);
</script>
не работает, выдает 0,1,0 и подобное, а надо 0,1,2. Вообще от break не могу разобраться работоспособности, только break 2; у меня работает, а надо переход к "top:"
просьба не отвечать типа а это что, это куда, запустите этот готовый код, и посмотри что выдает, если сообразите как до ума довести - пишите, спасибо.
возможно и ваш другой вариант кода посмотреть
|
|
03.12.2014, 23:51
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
wadim,
Это невозможно реализовать эффективно. Тебе после каждой генерации числа придется проверять его на повторяемость. Имхо, проще генерировать последоватльность, а затем делать рандомную выборку, с деструкцией. Но это вс нетривиальные алгоритмы.
|
|
03.12.2014, 23:57
|
Профессор
|
|
Регистрация: 20.01.2014
Сообщений: 150
|
|
Да мне эффективность не нужна, массив должен быть 4 элемента каждый элемент принимает значения от 0 до 19. к примеру arr[0,2,3,19]
krutoy, мысль ваша понятна, но не до конца, имеем
можно в ручную без лишнего сделать массив
qq= Array(0,1,2,3,4 ... 19);
А как далее? Как сделать рандомную выборку?
Последний раз редактировалось wadim, 04.12.2014 в 00:03.
|
|
04.12.2014, 00:17
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
Не знаю, как безкостыльно сделать реализацию рандома до 19 , ну х с ней, пусть будет так, допустим
gen=function(){var val= Math.round(Math.random()*20); if(val===20) return val-1; return val}
arr=[]
inArr=function(val){
for(var i=0; i<=arr.length; i++) {if(arr[i]===val) return true}
}
while(arr.length<4){
tmp=gen()
if(inArr(tmp)) continue; arr.push(tmp)
}
alert(arr)
// [ 9, 5, 2, 10 ]
//
// [ 18, 12, 6, 7 ]
//
// [ 14, 13, 18, 4 ]
//
// [ 6, 7, 19, 3 ]
//
// [ 13, 5, 16, 3 ]
//
// [ 6, 2, 16, 1 ]
//
// [ 15, 14, 3, 19 ]
//
// [ 11, 13, 19, 16 ]
//
// [ 1, 15, 2, 18 ]
//
// [ 15, 14, 10, 19 ]
//
// [ 6, 12, 5, 10 ]
//
// [ 15, 6, 16, 13 ]
//
// [ 3, 11, 15, 18 ]
//
// [ 10, 4, 9, 17 ]
//
// [ 14, 12, 4, 7 ]
//
// [ 15, 7, 18, 14 ]
//
// [ 11, 6, 14, 15 ]
//
// [ 9, 7, 4, 12 ]
//
// [ 0, 19, 16, 13 ]
//
// [ 7, 13, 16, 3 ]
Последний раз редактировалось krutoy, 04.12.2014 в 00:24.
|
|
04.12.2014, 00:21
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
var range = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var stack = [];
while(range.length) {
var index = Math.random() * range.length >> 0;
var item = range.splice(index, 1)[0];
stack.push(item);
}
alert(JSON.stringify(stack));
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
04.12.2014, 00:26
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
|
|
04.12.2014, 00:50
|
Профессор
|
|
Регистрация: 20.01.2014
Сообщений: 150
|
|
Всем спасибо, отдельно krutoy. krutoy Ваш вариант то что нужно.
|
|
04.12.2014, 00:57
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
wadim,
Только в моем варианте рандом кривовато сделан Там 19 будет повторяться чаще, наверное. Я не уверен, но попробуй вот такой гнератор
gen=function(){return Math.round(Math.random()*19)}
arr=[]
inArr=function(val){
for(var i=0; i<=arr.length; i++) {if(arr[i]===val) return true}
}
while(arr.length<4){
tmp=gen()
if(inArr(tmp)) continue; arr.push(tmp)
}
alert(arr)
// ::: [ 0, 17, 7, 6 ]
// :::
// ::: [ 4, 5, 16, 7 ]
// :::
// ::: [ 5, 19, 7, 2 ]
// :::
// ::: [ 14, 17, 9, 12 ]
// :::
// ::: [ 14, 11, 12, 5 ]
// :::
// ::: [ 16, 11, 7, 10 ]
// :::
// ::: [ 6, 8, 14, 13 ]
// :::
// ::: [ 16, 1, 12, 11 ]
// :::
// ::: [ 18, 10, 16, 19 ]
// :::
// ::: [ 11, 14, 10, 6 ]
// :::
// ::: [ 14, 8, 17, 16 ]
// :::
// ::: [ 13, 10, 2, 17 ]
// :::
// ::: [ 9, 17, 13, 2 ]
// :::
// ::: [ 11, 1, 0, 7 ]
// :::
// ::: [ 15, 18, 9, 10 ]
// :::
// ::: [ 17, 8, 13, 18 ]
// :::
// ::: [ 12, 6, 15, 5 ]
// :::
// ::: [ 6, 5, 16, 13 ]
// :::
// ::: [ 3, 18, 14, 1 ]
// :::
// ::: [ 10, 12, 7, 1 ]
// :::
// ::: [ 7, 0, 13, 12 ]
// :::
// ::: [ 17, 12, 10, 4 ]
// :::
// ::: [ 12, 2, 14, 16 ]
// :::
// ::: [ 16, 0, 13, 15 ]
// :::
// ::: [ 10, 9, 0, 16 ]
// :::
// ::: [ 12, 16, 8, 5 ]
// :::
// ::: [ 14, 2, 3, 12 ]
// :::
// ::: [ 14, 10, 6, 18 ]
// :::
// ::: [ 8, 0, 7, 11 ]
// :::
// ::: [ 18, 17, 13, 2 ]
// :::
// ::: [ 4, 15, 16, 9 ]
// :::
// ::: [ 18, 5, 17, 10 ]
// :::
// ::: [ 11, 19, 10, 2 ]
// :::
// ::: [ 2, 12, 6, 1 ]
// :::
// ::: [ 2, 16, 18, 4 ]
// :::
// ::: [ 13, 9, 17, 7 ]
// :::
// ::: [ 15, 7, 10, 12 ]
// :::
// ::: [ 2, 7, 3, 4 ]
// :::
// ::: [ 9, 6, 10, 4 ]
// :::
// ::: [ 18, 4, 16, 14 ]
// :::
// ::: [ 7, 18, 6, 13 ]
// :::
// ::: [ 17, 10, 1, 0 ]
// :::
// ::: [ 11, 14, 17, 3 ]
// :::
// ::: [ 5, 16, 2, 19 ]
// :::
// ::: [ 14, 3, 12, 5 ]
// :::
// ::: [ 1, 8, 10, 14 ]
// :::
// ::: [ 8, 17, 1, 13 ]
// :::
// ::: [ 19, 1, 11, 18 ]
// :::
// ::: [ 18, 10, 14, 11 ]
// :::
// ::: [ 13, 19, 1, 17 ]
// :::
// ::: [ 12, 3, 9, 5 ]
Если это важно.
Я потестил, вроде работает. Не силен я в математике
|
|
04.12.2014, 01:15
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
krutoy,
0 и 19 будут выпадать реже в 2 раза чем любое другое число
|
|
04.12.2014, 01:18
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
Math.floor(Math.random()*20)
|
|
|
|