2017-01-03 3 views
1

Я хочу создать списки элементов, в которых элементы выбираются случайным образом с каждым элементом, выбранным из другой группы. Я очень новичок в этом, но этот код, похоже, делает это.списки случайно выбранных элементов

<html> 
<body> 
<p>Random items from three different groups:</p> 
<script type="text/javascript"> 
<!-- 
document.write('<ol>'); 
    // first group 
    var first_group = new Array(); 
    first_group[0] = "one"; 
    first_group[1] = "two"; 
    first_group[2] = "three"; 
    var i = Math.floor(3*Math.random()) 
    document.write('<li>' + first_group[i]); 
    // second group 
    var second_group = new Array(); 
    second_group[0] = "three"; 
    second_group[1] = "four"; 
    second_group[2] = "five"; 
    var i = Math.floor(3*Math.random()) 
    document.write('<li>' + second_group[i]); 
    // third group 
    var third_group = new Array(); 
    third_group[0] = "five"; 
    third_group[1] = "six"; 
    third_group[2] = "seven"; 
    var i = Math.floor(3*Math.random()) 
    document.write('<li>' + third_group[i]); 
document.write('</ol>'); 
//--> 
</script> 
</body> 
</html> 

Можно ли изменить код так, что даже если одни и те же элементы встречаются в нескольких группах, и тот же элемент не может оказаться больше, чем когда-то в окончательном списке? (Например, если «три» выбрано из первой группы, его нельзя выбрать из второго.) И можно ли иметь окончательный список в случайном порядке? Любые предложения по другим улучшениям тоже приветствуются.

+0

http://stackoverflow.com/questions/20292750/unique-random. -values-from-array-of-unique-values-javascript также http://stackoverflow.com/questions/10688027/50-random-unique-elements-from-an-array-of-1000-elemens – mplungjan

+0

Создать массив для всех 3 результатов. После первого сделайте некоторое время, чтобы проверить, содержит ли этот новый массив выбранный ответ, до тех пор, пока вы не перейдете к третьей группе. – Alan

+0

С целью вашего вывода, почему есть три группы? их в один объект и устранить дубликаты? Seee http://stackoverflow.com/questions/30025965/merge-duplicate-objects-in-array-of-objects. – Sablefoste

ответ

1

Попробуйте это:

<html> 

<body> 
    <p>Random items from three different groups:</p> 
    <script type="text/javascript"> 
     var selectedValues = []; 

     function chooseRandom(array) { 
      // Select random number until it's a number that wasn't selected yet 
      do { 
       var random = Math.floor(array.length * Math.random()); 
       var randomResult = array[random]; 
      } while (selectedValues.indexOf(randomResult) > -1) 

      // Log the selected number so it won't be selected randomly again 
      selectedValues.push(randomResult); 
      return randomResult; 
     } 

     document.write('<ol>'); 
     var first_group = ["one", "two", "three"]; 
     var second_group = ["three", "four", "five"]; 
     var third_group = ["five", "six", "seven"]; 

     document.write('<li>' + chooseRandom(first_group) + '</li>'); 
     document.write('<li>' + chooseRandom(second_group) + '</li>'); 
     document.write('<li>' + chooseRandom(third_group) + '</li>'); 

     // Finalize 
     document.write('</ol>'); 
    </script> 
</body> 

</html> 
+0

Не будет 'selectedValues' выходить за пределы функции' selectRandom', если вы не определяете ее глобально? – Sablefoste

+0

'selectedValues' определяется в более высокой части иерархии цепочки областей и поэтому доступен из функции' selectRandom' –

1

Использование пользовательских JavaScript функция будет лучшим способом. Основываясь на вашем примере (вы, возможно, придется расширить для более сложной экосистемы:

<script type="text/javascript"> 
<!-- 
var i=j=k=x=0; 

var first_group = ["one", "two", "three"]; 
var second_group = ["three", "four", "five"]; 
var third_group = ["five", "six", "seven"]; 

i = Math.floor(3*Math.random()); 
j = Math.floor(3*Math.random()); 
k = Math.floor(3*Math.random()); 

var okayArray=makeNoDup(first_group,i,second_group,j,third_group,k); 

document.write('<ol>'); 
okayArray.forEach(function(e) { 
    document.write('<li>' + e[x] + '</li>'); 
    x++; 
} 
document.write('</ol>'); 


function makeNoDup(first,i,second,j,third,k){ 
    if(first[i] === second[j]){  
    var newj = Math.floor(3*Math.random()); 
    j= makeNoDup(first, i, second, newj, third, k); 
    } 
    if(first[i] === third[K] || second[j] === third[k]){  
    var newK = Math.floor(3*Math.random()); 
    k= makeNoDup(first, i, second, j, third, newk); 
    } 
    var answer = { 
    first: i, 
    second: j, 
    third: k 
    }; 
    return (answer); 
} 
//--> 
</script> 

Ключ рекурсивная функция makeNoDup

Смежные вопросы