LINUX.ORG.RU

Простой генератор с выводом суммы чисел

 


0

1

сабж. цель — нужно определенное количество чисел (рандомно) в заданном пределе и еще, чтобы все эти числа, помимо того, что выводятся на экран, еще и просуммировались и вывело сумму. я понимаю, что можно сделать как-то через потоковый калькулятор bc или awk, но не совсем понимаю, как это реализовать. собственно числа я получаю, нужно их просуммировать

#!/bin/bash

FLOOR=425
var=0
LIMIT=30
while [ "$var" -le $LIMIT ]; do
		INT=$(($RANDOM%500))
			if [ "$INT" -gt "$FLOOR" ]; then
					echo $INT.$(($RANDOM%99))
					var=$(($var+1))
				fi
	done

Ответ на: комментарий от sshvabodka

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

#!/bin/bash

FLOOR=425
var=0
LIMIT=30
while [ "$var" -le $LIMIT ]; do
		INT=$(($RANDOM%500))
			if [ "$INT" -gt "$FLOOR" ]; then
					echo $INT.$(($RANDOM%99)) | tee -a file
					#sum=$((sum+INT))
					var=$(($var+1))
				fi
	done
#echo $sum
cat file
awk '{s += $1} END {print s}' file
но как то не изящно

conformist ★★★
() автор топика

Можно упростить, если приводить любое число в нужный диапазон. Естественно через bc. Суть в том, чтобы использовать диапазон не для ограничения чисел (гоняя вхолостую циклы) а как коэффициент. Известно максимальное число [code=tex]$R_max$[/code]. Получаем [code=tex]$V = V_0 \cdot FLOOR/R_max$[/code].

Как-то так.

UPD: почему до сих пор не работает разметка для TeX?

ziemin ★★
()
Последнее исправление: ziemin (всего исправлений: 1)
Ответ на: комментарий от conformist
#!/bin/bash

yes | awk \
  -v SEED=$RANDOM \
  -v FLOOR=425 \
  -v LIMIT=30 \
'BEGIN{
  srand(SEED);
  sum=0;
}
{
  i = rand()*500;
  if(i>FLOOR) {
    print i;
    sum+=i;
    LIMIT--;
  }
}
LIMIT==0{
  print "sum:" sum
  exit
}'
anonymous
()
Ответ на: комментарий от anonymous
486.552
…
475.164
sum:13912.8

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

#!/bin/bash

FLOOR=425
var=0
LIMIT=30
while [ "$var" -lt $LIMIT ]; do
		INT=$(($RANDOM%500))
			if [ "$INT" -gt "$FLOOR" ]; then
					echo $INT.$(($RANDOM%99)) | tee -a file
					var=$(($var+1))
				fi
	done
cat file | tr '\n' '\+' | sed s/.$// | bc
$~ ./gen
(standard_in) 1: syntax error
как я понимаю, bc не хочет принимать вход с потока, потому что если содержимое этого файла передать как
echo '483.41+472.0+....+498.89+457.97+480.16' | bc
то он все считает отлично, и главное правильно, с двумя знаками после ноля, как побороть не знаю, а такой вариант меня в принципе устраивал бы

conformist ★★★
() автор топика
Ответ на: комментарий от joy4eg

выше сообщение, ошибка та же, bc не хочет так считать, синтаксическая ошибка

conformist ★★★
() автор топика
Ответ на: комментарий от conformist

после: i = rand()*500; написать: i = sprintf("%.2f",i);

printf("sum: %.3f",sum) заменить на: printf("sum: %.2f",sum);

anonymous
()
Ответ на: комментарий от conformist

Представь, что у тебя числа от 0 до 4млрд. А тебе нужно от 0 до 255. Подставляем:

  • минимум - 0
  • посерединке - [code=tex]$V = 244433333\text{(к примеру)} \cdot 255/4294967295=14,5124504179$[/code].
  • максимум будет 255
ziemin ★★
()
Последнее исправление: ziemin (всего исправлений: 2)

в общем решил задачу, сделал так:

 #!/bin/bash
  2 
 FLOOR=425
 var=0
 LIMIT=30
 while [ "$var" -lt $LIMIT ]; do
         INT=$(($RANDOM%500))
             if [ "$INT" -gt "$FLOOR" ]; then
                     echo $INT.$(($RANDOM%99)) | tee -a file
                     var=$(($var+1))
                 fi
     done
 echo `cat file | tr '\n' '\+' | sed s/.$//` | bc
 rm file
теперь bc не ругается. anonymous решение через awk очень хорошее, но после всех нужных манипуляция стали попадаться числа <100, что недопустимо. всем спасибо за внимание

conformist ★★★
() автор топика

что можно сделать как-то через потоковый калькулятор bc или awk, но не совсем понимаю, как это реализовать

bc умеет функции:

$ echo "              define f (x) {
                if (x <= 1) return (1);
                return (f(x-1) * x);
              }
f(10)
"|bc
3628800

подробности в man bc (пример оттуда).

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.