Как случайным образом получить значение из таблицы [duplicate]

Это одно из самых запутанных сообщений об ошибках, которые каждый программист VC ++ видел снова и снова. Давайте сначала сделаем чёткость.

A. Что такое символ? Короче говоря, символ - это имя. Это может быть имя переменной, имя функции, имя класса, имя typedef или что-либо кроме тех имен и знаков, которые принадлежат языку C ++. Он определяется пользователем или вводится библиотекой зависимостей (другой пользовательский).

B. Что является внешним? В VC ++ каждый исходный файл (.cpp, .c и т. Д.) Рассматривается как единица перевода, компилятор компилирует по одному модулю за раз и генерирует один объектный файл (.obj) для текущей единицы перевода. (Обратите внимание, что каждый заголовочный файл, включенный в этот исходный файл, будет предварительно обработан и будет рассматриваться как часть этой единицы перевода). Все внутри единицы перевода считается внутренним, все остальное считается внешним. В C ++ вы можете ссылаться на внешний символ, используя ключевые слова, такие как extern, __declspec (dllimport) и т. Д.

C. Что такое «решимость»? Resolve - термин времени связывания. Во время компоновки линкер пытается найти внешнее определение для каждого символа в объектных файлах, которые не могут найти свое определение внутри. Объем этого процесса поиска, включая:

  • Все объектные файлы, сгенерированные во время компиляции
  • Все библиотеки (.lib), которые явно или неявно указаны как дополнительные зависимости это строительное приложение.

Этот процесс поиска называется разрешением.

D. Наконец, почему Unresolved External Symbol? Если компоновщик не может найти внешнее определение для символа, который не имеет определения внутри, он сообщает об ошибке неразрешенного внешнего символа.

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

  1. Определение существует

Например, если у нас есть функция foo, определенная в a.cpp:

int foo()
{
    return 0;
}

В b.cpp мы хотим вызвать функцию foo, поэтому добавим

void foo();

, чтобы объявить функцию foo () и вызвать ее в другом теле функции, скажем bar():

void bar()
{
    foo();
}

Теперь, когда вы создаете этот код, вы получите ошибку LNK2019, жалуясь, что foo является неразрешенным символом , В этом случае мы знаем, что foo () имеет свое определение в a.cpp, но отличается от того, которое мы вызываем (другое возвращаемое значение). Это означает, что определение существует.

  1. Определение не существует

Если мы хотим вызвать некоторые функции в библиотеке, но библиотека импорта не добавлен в дополнительный список зависимостей (установленный из: Project | Properties | Configuration Properties | Linker | Input | Additional Dependency) вашего проекта. Теперь компоновщик сообщит LNK2019, поскольку определение не существует в текущей области поиска.

11
задан Yu Hao 23 November 2013 в 04:15
поделиться

3 ответа

Перед использованием math.random() необходимо запустить math.randomseed(), например:

math.randomseed(os.time())

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

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

math.randomseed(os.time())
math.random(); math.random(); math.random()

Обратите внимание, что стандартная библиотека C random() обычно не настолько однородно случайным, лучшим решением является использование лучшего случайного генератора, если ваша платформа обеспечивает его.

Ссылка: Lua Math Library

10
ответ дан Yu Hao 28 August 2018 в 01:58
поделиться
math.randomseed(os.clock()*100000000000)
for i=1,3 do
    math.random(10000, 65000))
end

Всегда приводит к появлению нового случайного числа. Изменение значения семени гарантирует случайность, Dont следует за os.time() за время своей эпохи и изменяется через одну секунду, но os.clock() не имеет одинакового значения в любом закрытом экземпляре. Ура!

4
ответ дан daemonsl 28 August 2018 в 01:58
поделиться

Генератор случайных чисел стандарта C, используемый в Lua, не является подходящим для моделирования. Слова «цепь Маркова» предполагают, что вам может понадобиться лучшая. Вот генератор, широко используемый для расчетов Монте-Карло:

local A1, A2 = 727595, 798405  -- 5^17=D20*A1+A2
local D20, D40 = 1048576, 1099511627776  -- 2^20, 2^40
local X1, X2 = 0, 1
function rand()
    local U = X2*A2
    local V = (X1*A2 + X2*A1) % D20
    V = (V*D20 + U) % D40
    X1 = math.floor(V/D20)
    X2 = V - X1*D20
    return V/D40
end

Он генерирует число от 0 до 1, поэтому r = math.floor(rand()*10) + 1 войдет в ваш пример. (Это мультипликативный генератор случайных чисел с периодом 2 ^ 38, множитель 5 ^ 17 и по модулю 2 ^ 40, исходный код Паскаля http://osmf.sscc.ru/~smp/ )

9
ответ дан GrayFace 28 August 2018 в 01:58
поделиться
Другие вопросы по тегам:

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