Случайное поколение числа плавающее

Во-первых, почему вы используете var? вам нужна эта переменная глобальная? Во-вторых, ES обеспечивает экспорт как для функции, так и для переменной ...

попробуйте это

export function test () {
    return test = "123";
}
260
задан Uwe Keim 5 December 2018 в 19:44
поделиться

7 ответов

rand() может использоваться для генерации псевдослучайных чисел в C++. В сочетании с RAND_MAX и немного математики, можно генерировать случайные числа в любом произвольном интервале, который Вы выбираете. Это достаточно для изучения целей и игрушечных программ. При необходимости в действительно случайных числах с нормальным распределением необходимо будет использовать больше передового метода.


Это генерирует число от 0,0 до 1,0, включительно.

float r = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);

Это генерирует число от 0,0 до некоторых произвольных float, X:

float r2 = static_cast <float> (rand()) / (static_cast <float> (RAND_MAX/X));

Это генерирует число от некоторых произвольных LO некоторым произвольным HI:

float r3 = LO + static_cast <float> (rand()) /( static_cast <float> (RAND_MAX/(HI-LO)));

Обратите внимание что rand() функция часто не будет достаточна при необходимости в действительно случайных числах.


Перед вызовом rand(), необходимо сначала "отобрать" генератор случайных чисел путем вызова srand(). Это должно быть сделано однажды во время выполнения Вашей программы - не один раз во время, которое Вы называете rand(). Это часто делается как это:

srand (static_cast <unsigned> (time(0)));

Для вызова rand или srand Вы должны #include <cstdlib>.

Для вызова time, Вы должны #include <ctime>.

361
ответ дан Florin Mircea 23 November 2019 в 02:36
поделиться

рэнд () возвращает интервал между 0 и RAND_MAX. Для получения случайного числа между 0,0 и 1.0 сначала бросьте международный возврат рэндом () к плаванию, затем разделитесь на RAND_MAX.

0
ответ дан James Curran 23 November 2019 в 02:36
поделиться

Назовите код с два float значения, код работает в любом диапазоне.

float rand_FloatRange(float a, float b)
{
    return ((b - a) * ((float)rand() / RAND_MAX)) + a;
}
24
ответ дан Ziezi 23 November 2019 в 02:36
поделиться

Смотрите на Повышение. Случайный. Вы могли сделать что-то вроде этого:

float gen_random_float(float min, float max)
{
    boost::mt19937 rng;
    boost::uniform_real<float> u(min, max);
    boost::variate_generator<boost::mt19937&, boost::uniform_real<float> > gen(rng, u);
    return gen();
}

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

60
ответ дан rlbond 23 November 2019 в 02:36
поделиться

В некоторых системах (Windows с VC приходит на ум, в настоящее время), RAND_MAX является смехотворно маленьким, т.е. только 15 битов. При делении на RAND_MAX Вы только генерируете мантиссу 15 битов вместо 23 возможных битов. Это может или не может быть проблемой для Вас, но Вы пропускаете некоторые значения в этом случае.

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

float r = (float)((rand() << 15 + rand()) & ((1 << 24) - 1)) / (1 << 24);

Непротестированный, но мог бы работать :-)

5
ответ дан Joey 23 November 2019 в 02:36
поделиться

I wasn't satisfied by any of the answers so far so I wrote a new random float function. It makes bitwise assumptions about the float data type. It still needs a rand() function with at least 15 random bits.

//Returns a random number in the range [0.0f, 1.0f).  Every
//bit of the mantissa is randomized.
float rnd(void){
  //Generate a random number in the range [0.5f, 1.0f).
  unsigned int ret = 0x3F000000 | (0x7FFFFF & ((rand() << 8) ^ rand()));
  unsigned short coinFlips;

  //If the coin is tails, return the number, otherwise
  //divide the random number by two by decrementing the
  //exponent and keep going. The exponent starts at 63.
  //Each loop represents 15 random bits, a.k.a. 'coin flips'.
  #define RND_INNER_LOOP() \
    if( coinFlips & 1 ) break; \
    coinFlips >>= 1; \
    ret -= 0x800000
  for(;;){
    coinFlips = rand();
    RND_INNER_LOOP(); RND_INNER_LOOP(); RND_INNER_LOOP();
    //At this point, the exponent is 60, 45, 30, 15, or 0.
    //If the exponent is 0, then the number equals 0.0f.
    if( ! (ret & 0x3F800000) ) return 0.0f;
    RND_INNER_LOOP(); RND_INNER_LOOP(); RND_INNER_LOOP();
    RND_INNER_LOOP(); RND_INNER_LOOP(); RND_INNER_LOOP();
    RND_INNER_LOOP(); RND_INNER_LOOP(); RND_INNER_LOOP();
    RND_INNER_LOOP(); RND_INNER_LOOP(); RND_INNER_LOOP();
  }
  return *((float *)(&ret));
}
2
ответ дан 23 November 2019 в 02:36
поделиться

Forget about implementation ("be it done with strings" is obviously an implementation issue!) -- think about the algorithm, for Pete's sake... just as in, your very first TAG, man!

What you're looking for is all combinations of K items out of a set of N (the indices, 0 to N-1 , of the set bits). That's obviously simplest to express recursively, e.g., pseudocode:

combinations(K, setN):
  if k > length(setN): return "no combinations possible"
  if k == 0: return "empty combination"
  # combinations INcluding the first item:
  return (first-item-of setN) combined combinations(K-1, all-but-first-of setN)
   union combinations(K-1, all-but-first-of setN)

i.e., the first item is either present or absent: if present, you have K-1 left to go (from the tail aka all-but-firs), if absent, still K left to go.

Pattern-matching functional languages like SML or Haskell may be best to express this pseudocode (procedural ones, like my big love Python, may actually mask the problem too deeply by including too-rich functionality, such as itertools.combinations, which does all the hard work for you and therefore HIDES it from you!).

What are you most familiar with, for this purpose -- Scheme, SML, Haskell, ...? I'll be happy to translate the above pseudocode for you. I can do it in languages such as Python too, of course -- but since the point is getting you to understand the mechanics for this homework assignment, I won't use too-rich functionality such as itertools.combinations, but rather recursion (and recursion-elimination, if needed) on more obvious primitives (such as head, tail, and concatenation). But please DO let us know what pseudocode-like language you're most familiar with! (You DO understand that the problem you state is identically equipotent to "get all combinations of K items out or range(N)", right?).

Синтаксис следующий (бесстыдно заимствован из этого сайта ):

  #include <iostream>
  #include <random>

  ...

  std::tr1::mt19937 eng;  // a core engine class 
  std::tr1::normal_distribution<float> dist;     

  for (int i = 0; i < 10; ++i)        
      std::cout << dist(eng) << std::endl;
20
ответ дан 23 November 2019 в 02:36
поделиться
Другие вопросы по тегам:

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