Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Рандомные числа уникальные PHP (https://javascript.ru/forum/server/78004-randomnye-chisla-unikalnye-php.html)

Dark_Delphin 12.07.2019 14:04

Рандомные числа уникальные PHP
 
Всем привет.

Ребята, есть скрипт пхп который выдаёт массив 16 случайных уникальных чисел без повторов.

<?php
$limit = 16;
$max_num = 5000;
$used_nums = array();
while(1) {
  $random = rand(0, $max_num);
  if(!in_array($random, $used_nums)) {
     $used_nums[] = $random;
  }
  if(count($used_nums) == $limit) { break; }
}
var_dump($used_nums);


Подскажите, как привязать скрипт к кнопке, что-бы изначально нужно было нажать на кнопку и оно все это выводило, ну а далее все числа просто поместить в таблицу.



Заранее благодарен.

Dark_Delphin 12.07.2019 16:03

Фух. Получилось кое что сделать.

<form method="POST">
    <input type="submit" name="knopka" value="Создать 16 рандомных чисел в диапазоне от 1 до 5000" />
</form>




<?php
    # Если кнопка нажата
    if( isset( $_POST['knopka'] ) )
    {
        # Тут  код який виполянеться
		
$used = array();
while (count($used)<16){
    $rand = mt_rand(1,5000);
    if (!in_array($rand,$used)) {
        $used[] = $rand;    
        
    }
	
	 echo $rand."<br />";  
}



       
    }
?>


Теперь просто поместить все это окуратненько в таблицу числа, как это реализовать?

Dark_Delphin 12.07.2019 16:18

Например 3/4 столбца или т.п.

laimas 12.07.2019 16:52

Цитата:

Сообщение от Dark_Delphin
Получилось кое что сделать.

Уверены?

Dark_Delphin 12.07.2019 17:10

Цитата:

Сообщение от laimas (Сообщение 510180)
Уверены?

ну вот щас при нажатии рандомлятся 16 чисел в диапазоне от 1 до 5000.

Осталось эти 16 чисел поместить в ячейки таблицы, только я не могу понять, как это сделать...

laimas 12.07.2019 17:33

Цитата:

Сообщение от Dark_Delphin
ну вот щас при нажатии рандомлятся 16 чисел в диапазоне от 1 до 5000.

А если условие !in_array($rand,$used) не будет выполнено, то сколько чисел будет? Или не важно количество?

Dark_Delphin 12.07.2019 17:44

А почему оно не будет выполнено?

laimas 12.07.2019 17:52

Цитата:

Сообщение от Dark_Delphin
А почему оно не будет выполнено?

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

Dark_Delphin 12.07.2019 19:18

Цитата:

Сообщение от laimas (Сообщение 510185)
Потому, что rand, это генератор псевдослучайного числа и не обязательно, что в цикле всегда повезет и в каждой его итерации будет выпадать уникальнее значение.

Может совпадения, ну уже сколько раз протестил вроде не было совпадения. Ну если будет то переделывать на до будет.

А в табличку можно числа засунуть?

laimas 12.07.2019 19:31

echo '<table><tr>' . implode('</tr><tr>', array_map(function($v) {
    return '<td>' . implode('</td><td>', $v) . '</td>';
}, array_chunk($used, 4))) . '</tr></table>';

Dark_Delphin 12.07.2019 19:42

Цитата:

Сообщение от laimas (Сообщение 510188)
echo '<table><tr>' . implode('</tr><tr>', array_map(function($v) {
    return '<td>' . implode('</td><td>', $v) . '</td>';
}, array_chunk($used, 4))) . '</tr></table>';


Здесь, чтото не так, оно выводит кучу чисел теперь, а не 16 шт.

laimas 12.07.2019 19:53

array_chunk - разбивает массив на части, то есть если массив имеет 16 значений, значит будет массив с имеющий 4 вложения по четыре элемента. array_map - обходит его соединяя каждое вложение в строку, внешний implode соединит все в одну строку - таблицу, а 4 х 4 = 16.

Можете сразу формировать таблицу (начинать с '<table><tr>' до цикла), не помещая генерируемые числа в массив, а формировать из них строку ('<td>' . $rand . '</td>'), добавляя ее к строке, и деля итератор по модулю 4, добавлять к ней '</tr><tr>'. По окончании цикла закрыть строку - '</tr></table>'.

Dark_Delphin 12.07.2019 19:58

Пытаюсь слепить до кучи, все равно не получается, не могу понять до конца, я даже не предпологал, что это так делается

рони 12.07.2019 20:45

Dark_Delphin,
может сделать всё на клиенте?

рони 12.07.2019 20:51

создание таблицы из массива уникальных чисел
 
Dark_Delphin,
<!DOCTYPE html>

<html>

<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
        td {
            text-align: center;
            border: solid 1px #0000FF;
        }

        table {
            border-collapse: collapse;
            border: 1px solid #0000FF;
            width: 300px;
        }
    </style>
</head>

<body>
    <table></table>
    <script>
        Array.prototype.shuffle = function (min, max) {
            min = min || 0;
            max = ++max || this.length;
            var len = max - min;
            max = len - this.length;
            this.length = len;
            for (var a = this.length - 1; 0 <= a; a--) {
                if (a < max) break;
                var b = Math.floor(Math.random() * a),
                    c = void 0 === this[b] ? (b + min) : this[b];
                this[b] = void 0 === this[a] ? (a + min) : this[a];
                this[a] = c
            }
            this.reverse();
            this.length -= max;
            return this
        };

        var arr = Array(16).shuffle(1, 5000);
        var table = document.querySelector("table");
        var length = 4, tr;
        arr.forEach(function (number, indx) {
            if (indx % length == 0) tr = table.insertRow(indx / length | 0);
            var td = tr.insertCell(indx % length);
            td.innerHTML = number
        });
    </script>
</body>

</html>

laimas 12.07.2019 21:01

Dark_Delphin, если как ранее писалось - получить не повторяющиеся, то только так:

$a = range(1, 5000);
shuffle($a); //перемешанный массив (сохранить в сессии), срезы которого по 16 элементов, со смещением 16, можно выводить по каждому запросу клиента.


Либо формируете массив - $a = range(1, 5000);, а затем выбираете случайные значения из него - array_rand($a, 16).

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

Dark_Delphin 13.07.2019 00:05

Цитата:

Сообщение от рони (Сообщение 510193)
Dark_Delphin,
<!DOCTYPE html>

<html>

<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
        td {
            text-align: center;
            border: solid 1px #0000FF;
        }

        table {
            border-collapse: collapse;
            border: 1px solid #0000FF;
            width: 300px;
        }
    </style>
</head>

<body>
    <table></table>
    <script>
        Array.prototype.shuffle = function (min, max) {
            min = min || 0;
            max = ++max || this.length;
            var len = max - min;
            max = len - this.length;
            this.length = len;
            for (var a = this.length - 1; 0 <= a; a--) {
                if (a < max) break;
                var b = Math.floor(Math.random() * a),
                    c = void 0 === this[b] ? (b + min) : this[b];
                this[b] = void 0 === this[a] ? (a + min) : this[a];
                this[a] = c
            }
            this.reverse();
            this.length -= max;
            return this
        };

        var arr = Array(16).shuffle(1, 5000);
        var table = document.querySelector("table");
        var length = 4, tr;
        arr.forEach(function (number, indx) {
            if (indx % length == 0) tr = table.insertRow(indx / length | 0);
            var td = tr.insertCell(indx % length);
            td.innerHTML = number
        });
    </script>
</body>

</html>

Харош, отлично, бро. У меня не зашло, чтот на яве, а с пхп как-то сложно.

Dark_Delphin 13.07.2019 00:10

Конструкция жесткая у меня))
<?php
    # Если кнопка нажата
    if( isset( $_POST['knopka'] ) )
    {
        # Тут  код який виполянеться

?>

 <style type="text/css">
        td {
            text-align: center;
            border: solid 1px #0000FF;
        }

        table {
            border-collapse: collapse;
            border: 1px solid #0000FF;
            width: 300px;
        }
    </style>
</head>

<body>
    <table></table>
    <script>
        Array.prototype.shuffle = function (min, max) {
            min = min || 0;
            max = ++max || this.length;
            var len = max - min;
            max = len - this.length;
            this.length = len;
            for (var a = this.length - 1; 0 <= a; a--) {
                if (a < max) break;
                var b = Math.floor(Math.random() * a),
                    c = void 0 === this[b] ? (b + min) : this[b];
                this[b] = void 0 === this[a] ? (a + min) : this[a];
                this[a] = c
            }
            this.reverse();
            this.length -= max;
            return this
        };

        var arr = Array(16).shuffle(1, 5000);
        var table = document.querySelector("table");
        var length = 4, tr;
        arr.forEach(function (number, indx) {
            if (indx % length == 0) tr = table.insertRow(indx / length | 0);
            var td = tr.insertCell(indx % length);
            td.innerHTML = number
        });
    </script>
</body>

<?php
       
    }
?>

Dark_Delphin 13.07.2019 00:15

А можно сделать, что-бы изначально чисел не было, как открываешь страницу с кодом рандомных чисел?

рони 13.07.2019 00:29

Dark_Delphin,
<!DOCTYPE html>

<html>

<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
        td {
            text-align: center;
            border: solid 1px #0000FF;
        }

        table {
            border-collapse: collapse;
            border: 1px solid #0000FF;
            width: 300px;
        }
    </style>
</head>

<body>
    <table class="num"></table>
    <script>
        Array.prototype.shuffle = function (min, max) {
            min = min || 0;
            max = ++max || this.length;
            var len = max - min;
            max = len - this.length;
            this.length = len;
            for (var a = this.length - 1; 0 <= a; a--) {
                if (a < max) break;
                var b = Math.floor(Math.random() * a),
                    c = void 0 === this[b] ? (b + min) : this[b];
                this[b] = void 0 === this[a] ? (a + min) : this[a];
                this[a] = c
            }
            this.reverse();
            this.length -= max;
            return this
        };
        function addNumber()
        {
        var arr = Array(16).shuffle(1, 5000);
        var table = document.querySelector(".num");
            table.innerHTML = "";
        var length = 4, tr;
        arr.forEach(function (number, indx) {
            if (indx % length == 0) tr = table.insertRow(indx / length | 0);
            var td = tr.insertCell(indx % length);
            td.innerHTML = number
        });
        }


    </script>
    <input name="" type="button" value="add Number To Table" onclick="addNumber()">
</body>

</html>

Dark_Delphin 15.07.2019 09:40

Рони, извиняюсь, еще такой вопрос.
Можно ли дать заголовок первым 10 числам и также второй заголовок остальным 6 числам?

<style type="text/css">
        td {
            text-align: center;
            border: solid 1px #0000FF;
        }

        table {
            border-collapse: collapse;
            border: 1px solid #0000FF;
            width: 66%;
			font-size:50px;
        }
    </style>


<body>


<input name="" type="button" value="Сгенерировать 16 уникальных чисел от 1 до 5000" onclick="addNumber()">

<hr />

    <table class="num">
	<caption>Один месяц без...</caption>
	</table>
	
	
	
    <script>
        Array.prototype.shuffle = function (min, max) {
            min = min || 0;
            max = ++max || this.length;
            var len = max - min;
            max = len - this.length;
            this.length = len;
            for (var a = this.length - 1; 0 <= a; a--) {
                if (a < max) break;
                var b = Math.floor(Math.random() * a),
                    c = void 0 === this[b] ? (b + min) : this[b];
                this[b] = void 0 === this[a] ? (a + min) : this[a];
                this[a] = c
            }
            this.reverse();
            this.length -= max;
            return this
        };
        function addNumber()
        {
        var arr = Array(16).shuffle(1, 5000);
        var table = document.querySelector(".num");
            table.innerHTML = "";
        var length = 10, tr;
        arr.forEach(function (number, indx) {
            if (indx % length == 0) tr = table.insertRow(indx / length | 0);
            var td = tr.insertCell(indx % length);
            td.innerHTML = number
        });
        }


    </script>
    
</body>

рони 15.07.2019 10:40

Dark_Delphin,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
 </head>

<body>
<style type="text/css">
        td {
            text-align: center;
            border: solid 1px #0000FF;
        }

        table {
            border-collapse: collapse;
            border: 1px solid #0000FF;
            width: 66%;
			font-size:50px;
        }
        th{
            color: #0000CD;
        }

    </style>


<body>


<input name="" type="button" value="Сгенерировать 16 уникальных чисел от 1 до 5000" onclick="addNumber()">

<hr />

    <table class="num">
	<caption>Один месяц без...</caption>
	</table>



    <script>
        Array.prototype.shuffle = function (min, max) {
            min = min || 0;
            max = ++max || this.length;
            var len = max - min;
            max = len - this.length;
            this.length = len;
            for (var a = this.length - 1; 0 <= a; a--) {
                if (a < max) break;
                var b = Math.floor(Math.random() * a),
                    c = void 0 === this[b] ? (b + min) : this[b];
                this[b] = void 0 === this[a] ? (a + min) : this[a];
                this[a] = c
            }
            this.reverse();
            this.length -= max;
            return this
        };
        function addNumber()
        {
        var arr = Array(16).shuffle(1, 5000);
        var table = document.querySelector(".num");
            table.innerHTML = "";
        var length = 10, tr, thTitle = ["Заголовок 1", "Заголовок 2"];
        arr.forEach(function (number, indx) {
            if (indx % length == 0) {
               tr = table.insertRow(-1);
            if(thTitle.length){
               var th = document.createElement("th");
               th.colSpan = length;
               th.innerHTML = thTitle.shift();
               tr.appendChild(th);
               tr = table.insertRow(-1);
            }
            }
            var td = tr.insertCell(indx % length);
            td.innerHTML = number
        });
        }


    </script>

</body>

</body>
</html>

рони 15.07.2019 10:43

Dark_Delphin,
не копируйте сообщение целиком, если в этом нет необходимости.

Dark_Delphin 15.07.2019 11:36

оу... Рони, спасиб тебе большое. дай тебе здоровья за помощь)


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