Сумма случайных чисел должна быть больше x и меньше y

Я думаю, что наилучшей практикой для использования в этом случае является: при рендеринге html добавьте атрибут к элементу span.

example:

<div class="abc">
    <div class="time"><span intime="0305">03:05 NonStop</span></div>
    <div class="cost"><label class><span>₹4,976</span><label></div>
</div>

, затем

var timeSlots = $(".master > .abc > .time > span").each(function(i, e){
    var time = $(this).attr('intime');
    if( parseInt(time) > 0600 && parseInt(time) < 1200)
    {
        resultArray.push( $(this).val() );
    }
};
0
задан Jimi 20 January 2019 в 09:39
поделиться

2 ответа

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

  1. Генерация одного случайного числа в диапазоне от 120 до 235. Это будет окончательная сумма.
  2. Генерация шести случайных чисел в диапазоне от 0,0 до 1,0.
  3. Нормализуйте эти шесть чисел, то есть разделите каждое на сумму всех шести.
  4. Умножьте каждое из шести нормированных чисел на исходное случайное число.
  5. Округлите каждый из шести результатов.

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

'Create a random number generator.
Dim rng As New Random

'Create a random number in the desired range for the final sum.
Dim sum = rng.Next(120, 235 + 1)

'Generate six proportional values as fractions of 1.0.
Dim proportions = Enumerable.Range(1, 6).Select(Function(n) rng.NextDouble()).ToArray()

'Get the sum of all the proportional values.
Dim proportionsSum = proportions.Sum()

'Normalise the proportional values so that they sum to 1.0
proportions = Array.ConvertAll(proportions, Function(r) r / proportionsSum)

'Break the final sum up into the specified proportions.
Dim numbers = Array.ConvertAll(proportions, Function(r) CInt(Math.Round(r * sum)))

'Adjust as required if rounding has pushed the sum below the minimum value.
Do While numbers.Sum() < 120
    'Get a random element index.
    Dim index = rng.Next(0, numbers.Length)

    'Increment the element at that index.
    numbers(index) = numbers(index) + 1
Loop

'Adjust as required if rounding has pushed the sum above the maximum value.
Do While numbers.Sum() > 235
    'Get a random element index.
    Dim index = rng.Next(0, numbers.Length)

    'Decrement the element at that index.
    numbers(index) = numbers(index) - 1
Loop

'The numbers array now contains six random values with a sum in the range 120 to 235.
0
ответ дан jmcilhinney 20 January 2019 в 09:39
поделиться

Я бы предложил использовать .Net Случайный класс для генерации случайных чисел. Это также проще в использовании.

Найдите первое случайное число между 0 и минимальным значением, тогда второе случайное число будет в диапазоне: randomMin(MinValue) => (MinValue - randomMin, MaxValue - randomMin) :

randomMin = rnd1.Next(Min + 1)
randomMax = rnd2.Next(Min - randomMin, Max - randomMin + 1)
result = randomMin + randomMax

К помните, что в классе Random верхний предел является исключительным, поэтому нам нужно добавить 1 к значению Max, чтобы включить его в диапазон случайных значений.


Выполните пример теста:
( В этих примерах кода предполагается, что используемая версия VB.Net - не менее V.14, VS 2015+ )

Private rnd1 As Random = New Random()
Private rnd2 As Random = New Random()

'(...)

Dim Min As Integer = 120
Dim Max As Integer = 235

For i = 0 To 100
    Dim randomValues = GetRandomNumbersInRange(Min, Max)
    Console.WriteLine($"Random Min: {randomValues.rndMin} Random Max {randomValues.rndMax}")
    Console.WriteLine($"Sum: {randomValues.rndMin + randomValues.rndMax}")
Next

'(...)

Private Function GetRandomNumbersInRange(Min As Integer, Max As Integer) As 
                                        (rndMin As Integer, rndMax As Integer)
    Dim randomMin As Integer = rnd1.Next(Min + 1)
    Return (randomMin, rnd2.Next(Min - randomMin, Max - randomMin + 1))
End Function

Если вы хотите, чтобы метод напрямую возвращал сумму, вы можете изменить тип возврата метода следующим образом:

Dim Min As Integer = 120
Dim Max As Integer = 235

For i = 0 To 100
    Console.WriteLine(GetSumRandomNumbersInRange(Min, Max))
Next

'(...)

Private Function GetSumRandomNumbersInRange(Min As Integer, Max As Integer) As Integer
    Dim randomMin As Integer = rnd1.Next(Min + 1)
    Return randomMin + rnd2.Next(Min - randomMin, Max - randomMin + 1)
End Function

Случайные числа также могут быть выбран с:
randomMid(MaxValue - MinValue) => (MinValue, MaxValue - randomMid)

В этом случае, возможно, реализовано как:

Private Function GetSumRandomNumbersInRange2(Min As Integer, Max As Integer) As Integer
    Dim randomFirst As Integer = rnd1.Next(Max - Min + 1)
    Return randomFirst + rnd2.Next(Min, Max - randomFirst + 1)
End Function
0
ответ дан Jimi 20 January 2019 в 09:39
поделиться
Другие вопросы по тегам:

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