Различные числа от 1 до 10

Решение для сценария оболочки в 10 символов включая новые строки:

ну, технически не переполнение стека, но логически так, если Вы рассматриваете порождение нового процесса как построение нового стекового фрейма.

#!sh
./so

Результат:

antti@blah:~$ ./so
[disconnected]

Возгласы.Примечание: не пробуют это дома

6
задан gibz357 8 November 2010 в 06:10
поделиться

2 ответа

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

Что вам нужно, так это список в случайном порядке, который я бы реализовал с помощью следующего кода (псевдокод, поскольку это домашнее задание ):

dim n[10]                 // gives n[0] through n[9]
for each i in 0..9:
    n[i] = i              // initialize them to their indexes
nsize = 10                // starting pool size
do 10 times:
    i = rnd(nsize)        // give a number between 0 and nsize-1
    print n[i]
    nsize = nsize - 1     // these two lines effectively remove the used number
    n[i] = n[nsize]

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

Например, рассмотрите следующую лабораторную проверку:

<--------- n[x] ---------->
for x = 0 1 2 3 4 5 6 7 8 9  nsize  rnd(nsize)  output
---------------------------  -----  ----------  ------
        0 1 2 3 4 5 6 7 8 9     10           4       4
        0 1 2 3 9 5 6 7 8        9           7       7
        0 1 2 3 9 5 6 8          8           2       2
        0 1 8 3 9 5 6            7           6       6
        0 1 8 3 9 5              6           0       0
        5 1 8 3 9                5           2       8
        5 1 9 3                  4           1       1
        5 3 9                    3           0       5
        9 3                      2           1       3
        9                        1           0       9

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

И теперь ваша домашняя работа состоит в том, чтобы превратить это в VB: -)


И, поскольку это домашнее задание теперь почти наверняка просрочено (около года назад), я опубликую решение VBA, показывающее, как это сделать, для полноты.

Option Explicit
Option Base 0
Sub Macro1()
    Randomize
    Dim list(10) As Integer
    Dim i As Integer
    Dim size As Integer
    Dim pos As Integer
    Dim result As String

    For i = 0 To 9
        list(i) = i
    Next

    size = 10
    result = ":"
    For i = 1 To 10
        pos = Int(Rnd() * size)
        result = result & list(pos) & ":"
        size = size - 1
        list(pos) = list(size)
    Next

    MsgBox result
End Sub

Это сгенерировано в трех отдельных прогонах:

:5:7:4:2:9:1:0:8:3:6:
:3:9:6:0:7:8:5:4:2:1:
:7:6:3:5:1:8:9:0:4:2:
12
ответ дан 9 December 2019 в 22:35
поделиться

вам нужна случайная перестановка в массиве от 0 до 9.

Я забыл, как написать базовый .. что-то вроде:

dim a(10)
for i=0 to 9 do a(i) = i
rem do random permute over a:
for i=0 to 9 do 
  j = rand() mod (i+1)
  tmp = a(j)
  a(i) = a(j)
  a(j) = tmp
next i
1
ответ дан 9 December 2019 в 22:35
поделиться