Случайные числа в C

Я больше привык к Scheme, но вот решение, которое работает в Lisp:

(defun f (lst)
  (labels 
      ((loop (lst atoms lists)
         (cond
          ((null lst) 
           (append (reverse atoms) (reverse lists)))
          ((atom (car lst))
           (loop (cdr lst) (cons (car lst) atoms) lists))
          (T
           (loop (cdr lst) atoms (cons (car lst) lists))))))
    (loop lst '() '())))

(f '(5 -1 (2 6 1) (8 7 -3) (0 (9 4)) -6))

В основном вы перебираете список, и каждый элемент либо добавляется к списку атомов, либо списку списков.

EDIT

Вариант remove-if, конечно, короче:

(let ((l '(5 -1 (2 6 1) (8 7 -3) (0 (9 4)) -6)))
   (append
    (remove-if-not #'atom l)
    (remove-if     #'atom l)))
13
задан Aconcagua 18 October 2018 в 08:05
поделиться

10 ответов

Вызов srand () вне цикла. Вы повторно загружаете его на каждой итерации.

srand () заполняет генератор случайных чисел, поэтому вы получаете различную последовательность случайных чисел в зависимости от ввода. Ваш цикл выполняется очень быстро, поэтому вызов time (NULL) всегда возвращает одно и то же значение. Вы сбрасываетесь на одну и ту же случайную последовательность с каждой итерацией. Как правило, вызывайте srand () только один раз в своей программе.

21
ответ дан 1 December 2019 в 18:55
поделиться

Не вызывайте srand () каждый раз в цикле - просто сделайте это заранее.

6
ответ дан 1 December 2019 в 18:55
поделиться

srand - это функция, которая «заполняет» генератор случайных чисел. Если вы не знаете, случайные числа в компьютерах на самом деле не случайны. Фактически, у компьютера просто есть список чисел, которые кажутся случайными в нем, и вы используете srand , чтобы указать ему, где начать в этом списке, при каждом вызове rand () возврат следующего элемента в списке.

Причина, по которой вы пишете srand (time (NULL)) , заключается в том, чтобы заставить случайные числа запускаться в какой-то момент, который не будет одинаковым каждый раз при запуске программы (если только программы запускаются одновременно).

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

3
ответ дан 1 December 2019 в 18:55
поделиться

Перед входом в цикл необходимо вызвать srand () . srand () инициализирует генератор радномных чисел с заданным начальным числом и генерирует уникальную последовательность случайных чисел для этого начального числа.

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

1
ответ дан 1 December 2019 в 18:55
поделиться
srand(time(NULL));
for(i = 0; i < n; i++){
    for(j = 0; j < (n-1); j++){
        a[i,j] = rand();
    }
}

Неважно. Цифры такие же ...

0
ответ дан 1 December 2019 в 18:55
поделиться
srand(time(NULL)); 

for(i = 0; i < n; i++){         
        printf("%d ", time(NULL)); 
        for(j = 0; j < (n-1); j++){ 
            a[i,j] = rand(); 
        } 
    } 

Вызвать srand один раз вне цикла.

2
ответ дан 1 December 2019 в 18:55
поделиться

Сергей, вы не получили сообщение об ошибке в версии a[i,j] только потому, что это вполне корректное выражение. Оператор запятой оценивает подвыражения слева направо и возвращает значение последнего выражения. Таким образом, запись a[i,j] идентична a[j]. То, что вы получили в результате печати, было значением указателя на j-й вектор в вашей матрице.

0
ответ дан 1 December 2019 в 18:55
поделиться

FAQs 13.15 - 13.20 будут интересны. И я склонен создать новый тег для таких вопросов.

4
ответ дан 1 December 2019 в 18:55
поделиться

alt text

3
ответ дан 1 December 2019 в 18:55
поделиться
int** a;
int i;
printf("Enter array size: ");
scanf("%d", &n);
if( n < 1 ){
    printf("Size should be > 0\n\n");
    return NULL;
}
a = (int**)calloc(n, sizeof(int));
for(i = 0; i < n; i++)
    a[i] = (int*)calloc(n-1, sizeof(int));

Вот мой массив...

0
ответ дан 1 December 2019 в 18:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: