2015-08-31 4 views
4

То, что я пытаюсь сделать, это генерировать 6 случайных чисел, пять в диапазоне 1-45 и один в диапазоне 1-25 для греческой лотереи (Tzoker). Первые 5 номеров должны быть уникальными. Нажав кнопку, я хочу добавить эти числа в div, используя jQuery (у меня есть некоторый рабочий код для этой части).Генератор случайных лотерейных номеров

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

ответ

11

Позвольте мне предложить вам более простое решение.

  1. Составьте список всех чисел от 1 до 45.
  2. Сортировка списка с помощью Math.random (плюс минус что-то, read the docs of Array.sort выяснить) как функцию сравнения. Вы получите список в произвольном порядке.
  3. Просмотреть 5 первых предметов в этом списке.
  4. Затем, когда у вас уже есть номера, поместите их все в свой div.

Таким образом, вы не смешиваете свою логику (получение чисел) с презентацией (помещая материал в DOM).

Я оставляю реализацию как упражнение для читателя. :)

+0

Nice решение, но, как вы предоставите шестой номер в диапазоне 1-25? – LinkinTED

+0

Ах, я пропустил это. Простой: 'Math.ceil (Math.random() * 25)'. – mik01aj

3

Хотя это может быть не совсем то, что вы просили, если вы будете использовать lodash, это было бы так просто, как:

_.sample(_.range(1, 46), 5) // the 5 numbers from 1..45 
_.random(1, 26)    // one more from 1..25 

Вот почему functional programming так здорово. Вы можете прочитать, например, Javascript Allonge, чтобы узнать больше.

+0

Будет хорошо, если вы отредактируете свой предыдущий ответ и добавите его. :) –

+1

Я сделал это нарочно, это разные ответы. Хотя способ, которым он работает, схож, один из них является императивом, а другой - функциональным подходом. Кроме того, в этой статье предлагается использовать новую внешнюю библиотеку, которую многие люди пересмотрят. – mik01aj

1

http://jsfiddle.net/015d05uu/

var tzoker = $("#tzoker"); 
var results = $("#results"); 
tzoker.click(function() { 
    results.empty(); 
    var properResults = []; 
    var rand = 0; 
    var contains = false; 
    for (i = 1; i < 7; i++) { 
     do 
     { 
     (rand = Math.floor((Math.random() * (i != 6 ? 45 : 25)) + 1)); 
      contains = properResults.indexOf(rand) > -1; 
     } while(contains) 
     results.append("<br />", rand, "<br />"); 
     properResults.push(rand); 
    } 
}); 

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

4

Нравится?

$(function() { 
 
    $('button').on('click', function(e) { 
 
    e.preventDefault(); 
 
    
 
    var numArray = []; 
 
    
 
    while(numArray.length < 5) { 
 
     var number = Math.floor((Math.random() * 45) + 1); 
 
     if($.inArray(number, numArray) == -1) { 
 
     numArray.push(number); 
 
     } 
 
    } 
 
    numArray.push(Math.floor((Math.random() * 25) + 1)); 
 
    $('div').html(numArray.join("<br />")); 
 
    }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<button>Generate</button> 
 
<div></div>

+0

«Если (arrL == 5)» следует альтернативный синтаксис? – kogigr

+0

@kogigr Я неправильно понял вопрос. Я думал, что шестое число должно быть уникальным. Исправлено в коде :) – LinkinTED

1

Вы можете использовать общую функцию, которая генерирует случайные числа от 1 к maxValue, и добавляет их в массив, только если они не существуют. Затем, чтобы отобразить, пройдите через элементы массива и добавьте их в #randomNumbers.

HTML

<div id="randomNumbers"></div> 

JS (с JQuery)

var randomNumbersArray = []; 

$(function() { 
    generateRandomNumbers(); 
    displayRandomNumbers(); 
}); 

function generateRandomNumbers() { 
    for (i = 0; i < 5; i++) { 
     generateRandomNumberFrom1To(45); 
    } 
    generateRandomNumberFrom1To(25); 
} 

function generateRandomNumberFrom1To(maxValue) { 
    var randomNumber; 
    do { 
     randomNumber = Math.ceil(Math.random() * maxValue); 
    } while ($.inArray(randomNumber, randomNumbersArray) > -1); 
    randomNumbersArray.push(randomNumber); 
} 

function displayRandomNumbers() { 
    for (i in randomNumbersArray) { 
     $("#randomNumbers").append(randomNumbersArray[i] + "<br>"); 
    } 
}