2016-02-06 4 views
0

Я пытаюсь сделать вывод о том, как генерировать два случайных числа в качестве входных значений для параметров readproportion, updateproportion таким образом, чтобы сумма этих параметров была равна 1, в следующем команда bash.Как генерировать случайные числа между 0 и 1 в bash

$ ./bin/ycsb run basic -P workloads/workloada -p readproportion=0.50 -p updateproportion=0.50 

Помогите с вашими предложениями.

Благодаря

+1

Если сумма двух чисел ('a' и' b') предопределены, вам нужно только, чтобы сгенерировать случайное значение первого ('a') , так как 'b' всегда будет' 1 - a' –

+1

Bash - плохой инструмент для этого. Почему бы не использовать язык программирования общего назначения? Например, 'ruby -r 'securerandom' -e 'помещает SecureRandom.random_number'', а затем * вы * обрабатываете то, что составляет проблему с рюкзаком? –

+0

@CodeGnome Я отправил свое решение, где использовал функцию генератора случайных чисел python. – arazx

ответ

-2
import random 

for i in range(10): 
    r1 = random.random() 
    r2 = 1-r1 
    print(r1,r2) 

Выход:

(0.2018374660456982, 0.7981625339543018) 
(0.9475271373000609, 0.052472862699939116) 
(0.683256740718646, 0.31674325928135405) 
(0.18887601501013307, 0.8111239849898669) 
(0.4714270118819237, 0.5285729881180763) 
(0.8687054600890725, 0.13129453991092754) 
(0.07613616514567922, 0.9238638348543208) 
(0.3510476319286485, 0.6489523680713515) 
(0.4835202568714666, 0.5164797431285334) 
(0.5574848958553368, 0.4425151041446632) 
0

Вот супер простой способ сделать это:

echo 0."$RANDOM" 

^^ НЕ ИСПОЛЬЗОВАТЬ И ПРОЧТИТЕ НИЖЕ ^^

Edit:

Я не могу читать:

$ rnum=$((RANDOM%10000+1)) 
$ echo "scale=4; $rnum/10000" | bc 
.8748 
$ echo "scale=4; 1-$rnum/10000" | bc 
.1252 

Редакция 2:

Как указывалось, первая итерация этого ужаса. Как только я полностью прочитал этот вопрос и попытался сделать несколько простых вычислений с «номером». Я понял, что это супер сломан. Вы можете прочитать по адресу:

http://www.tldp.org/LDP/abs/html/randomvar.html - и - https://www.shell-tips.com/2010/06/14/performing-math-calculation-in-bash/

+0

Редактировать было для цитирования переменной. –

+1

Спасибо, но как я могу создать два случайных числа с определенным условием и назначить их на две переменные? – arazx

+4

Это очень плохое распространение! –

2

С идеей Роберта J:

RANDOM=$$      # Reseed using script's PID 
r1=$((${RANDOM}%98+1)) 
r2=$((100-$r1)) 
printf -v r1 "0.%.2d" $r1 
printf -v r2 "0.%.2d" $r2 
echo "$r1 $r2" 

выход (например):

 
0.66 0.34 
0.01 0.99 
0.42 0.58 
0.33 0.67 
0.22 0.78 
0.33 0.67 
0.65 0.35 
0.77 0.23 
0.71 0.29 
+0

Очень плохое распространение тоже. ': ('. –

+1

Надеюсь, вы знаете, что 0.5 и 0.95 на самом деле не складываются до 1. :-) – ruakh

+0

@ruakh: Спасибо за этот намек! Я исправил эту ошибку. – Cyrus

3

Насколько я может помнить, что $ {RANDOM} генерирует целые числа в интервале 0 - 32767. Таким образом, я думаю, вы можете попробовать что-то вроде это для генерации случайных значений в [0,1]:

bc -l <<< "scale=4 ; ${RANDOM}/32767" 
+0

для меня это дает то же самое каждый раз – theonlygusti

2
$ arr=($(awk 'BEGIN{srand(); r=rand(); print r, 1-r}')) 
$ echo "${arr[0]}" 
0.661624 
$ echo "${arr[1]}" 
0.338376 

$ arr=($(awk 'BEGIN{srand(); r=rand(); printf "%.2f %.2f\n", r, 1-r}')) 
$ echo "${arr[0]}" 
0.74 
$ echo "${arr[1]}" 
0.26 

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

Смежные вопросы