Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2018, 19:41   #1
Amilman
Пользователь
 
Регистрация: 19.12.2012
Сообщений: 49
Вопрос Реализовать диапазон случайных чисел.

Доброго времени суток.

К примеру есть 57 вопросов из которых должны отобразится всего 15 у пользователя на экране.

Каждый следующий вопрос должен появляться при нажатии кнопки.
Но как показала практика из за генерации случайных чисел вопросы могут выпадать по два раза подряд одни и те же. Или за все время прохождения теста.

Вопрос, как сделать проверку чисел чтобы не выводить значения которые уже были?
Amilman вне форума Ответить с цитированием
Старый 19.10.2018, 21:01   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Можно, например, в TList поместить номера вопросов, рандомно выбирать и удалять после выбора. Аналогично это можно сделать с массивом номеров.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 20.10.2018, 15:39   #3
jillitil
Форумчанин
 
Аватар для jillitil
 
Регистрация: 17.10.2018
Сообщений: 184
По умолчанию

Легко, красиво и изящно используя Set
Код:
VAR
   L: Set of 1..57  ;
   R: Byte;
   I: Integer;
Begin
  Randomize;
  For i:= 1 to 15 Do
  Begin
    Repeat
      R:= Random(57) + 1;
    Until Not (R in L);
      L:= L + [R]
  End;

  For I:= 1 to 57 Do
  If I in L Then WriteLn(I);
End.
jillitil вне форума Ответить с цитированием
Старый 21.10.2018, 02:26   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от jillitil Посмотреть сообщение
Легко, красиво и изящно используя Set
Ну да. И легко и красиво. Вот только кто будет задавать начальное состояние этого Set'a? Пушкин?
northener вне форума Ответить с цитированием
Старый 21.10.2018, 12:17   #5
jillitil
Форумчанин
 
Аватар для jillitil
 
Регистрация: 17.10.2018
Сообщений: 184
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
кто будет задавать начальное состояние
Компилятор. Он обнуляет все глобальные переменные. Если оформить в виде функции то да, надо будет руками кой чего дописать символов эдак семь. Тут вроде помощь, а не сделайте за меня бесплатно. Я рабочий код подкинул, остальное дело за воспрошающим.
jillitil вне форума Ответить с цитированием
Старый 22.10.2018, 09:30   #6
Amilman
Пользователь
 
Регистрация: 19.12.2012
Сообщений: 49
По умолчанию

Цитата:
Сообщение от jillitil Посмотреть сообщение
Компилятор. Он обнуляет все глобальные переменные. Если оформить в виде функции то да, надо будет руками кой чего дописать символов эдак семь. Тут вроде помощь, а не сделайте за меня бесплатно. Я рабочий код подкинул, остальное дело за воспрошающим.
Ваш код действительно работает но вот только числа всегда получаются двухзначные:26,28,30,31,35,37,38,39 ,42,45,46,47,48,49,50,52,54,57
И вопросы у которых id от 1..9 не выпадают и еще на 15 вопрос всегда выпадает id 57
Amilman вне форума Ответить с цитированием
Старый 22.10.2018, 09:32   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Ну так прочитайте хелп или в книге про функцию Random и ее параметр. Вдруг узнаете как сделать не двузначные и причем там 57.
p51x вне форума Ответить с цитированием
Старый 22.10.2018, 09:51   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от jillitil Посмотреть сообщение
Я рабочий код подкинул, остальное дело за воспрошающим.
Вот Вы понимаете, что если использовать ваш код в основной программе,то переменные будут переменные и компилятор их обнулит (кстати, борланд всегда говорил, что это поведение не гарантируется и в следующих версия оно может быть изменено). А если использовать код в процедуре/функции, то переменные будут локальные и там вообще будет мусор.
А Вы уверены, что тот новичок, который использует ваш код, об этом знает?

я уже молчу о том, что не иницилизировать переменные перед тем, как обратиться к ним - это ужасный моветон.
Классика же - Буратино дали два яблока. Сколько яблок у Буратино?
Ответ - а хрен его знает, нам же не сказали, сколько у него яблок было до этого.

ну и последнее.
в таких задачах намного удобнее просто заполнить массив(список) значениями подряд и потом перемешать случайным образом: ТЫЦ

например,
Код:
const N = 57;
var
 i,k,buf:integer;
 mas: array [1..N] of integer;
begin
 //заполнить
 for i:=1 to N do mas[i]:=i;
 Randomize;

 //----------перемешать-------------
 for i:=1 to N-1 do
  begin
   k:= Random(N-i+1)+i;
   if k<>i then begin
     buf:=mas[i];
     mas[i]:=mas[k];
     mas[k]:=buf;
   end;
  end;

 //-------------вывести-------------
 for i:=1 to N do Write(mas[i]:3);

end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.10.2018, 11:05   #9
Amilman
Пользователь
 
Регистрация: 19.12.2012
Сообщений: 49
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Вот Вы понимаете, что если использовать ваш код в основной программе,то переменные будут переменные и компилятор их обнулит (кстати, борланд всегда говорил, что это поведение не гарантируется и в следующих версия оно может быть изменено). А если использовать код в процедуре/функции, то переменные будут локальные и там вообще будет мусор.
А Вы уверены, что тот новичок, который использует ваш код, об этом знает?

я уже молчу о том, что не иницилизировать переменные перед тем, как обратиться к ним - это ужасный моветон.
Классика же - Буратино дали два яблока. Сколько яблок у Буратино?
Ответ - а хрен его знает, нам же не сказали, сколько у него яблок было до этого.

ну и последнее.
в таких задачах намного удобнее просто заполнить массив(список) значениями подряд и потом перемешать случайным образом: ТЫЦ
Спасибо, вы очень помогли!
С помощью вашего примера при создании страницы заполняю memo.
Далее по кнопке беру первую строку memo и подставлю в запрос:
Код:
QueryQuestion.SQL.Text := 'SELECT TOP 1 * FROM Questions WHERE (id='+(IDQuestion)+');';
А далее удаляю первую строку из memo тем самым при следующем нажатии кнопки, вопрос будет с новым id
Amilman вне форума Ответить с цитированием
Старый 22.10.2018, 11:38   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

пожалуйста.

Цитата:
Сообщение от Amilman Посмотреть сообщение
Далее по кнопке беру первую строку memo и подставлю в запрос:
Всё так. Но зачем Вам мемо для этого?
объявите массив, при создании формы заполните его (перемешайте) и потом берите по одному значению.
примерно так:
Код:
unit Unit1;

interface

uses ....;

type
  TForm1 = class(TForm)

    .....

    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

const MaxQuestion = 57;

var
  ArrQuestion:array[1..MaxQuestion] of integer;
  QIndex : integer;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
 i,k,buf:integer;
begin
 Randomize;

 //заполнить
 for i:=1 to MaxQuestion do ArrQuestion[i]:=i;

 //----------перемешать-------------
 for i:=1 to MaxQuestion-1 do
  begin
   k:= Random(MaxQuestion-i+1)+i;
   if k<>i then begin
     buf:=ArrQuestion[i];
     ArrQuestion[i]:=ArrQuestion[k];
     ArrQuestion[k]:=buf;
   end;
  end;

 QIndex := 1; // индекс поставим на первую позицию
end;

где надо использовать
Код:
QueryQuestion.SQL.Text := 
  'SELECT TOP 1 * FROM Questions WHERE (id='+(IntToStr(ArrQuestion[QIndex]))+');';

Inc(QIndex); // переставим индекс на следующий случайный вопрос из массива
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Записать в файл последовательного доступа N натуральных чисел: a1, a2, ... аn (числа получить с помощью генератора случайных чисел Casillas1 Помощь студентам 15 15.05.2014 11:41
5.Создать файл из 100 целых чисел, лежащих на отрезке [150,9000], используя генератор случайных чисел. -Вывести эти viktoriya95 Паскаль, Turbo Pascal, PascalABC.NET 0 21.02.2014 22:36
Реализовать генератор случайных чисел, ассемблер Pusher Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 24.08.2010 00:12
как задать диапазон для случайных чисел Аlex Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 07.05.2010 03:18
Генерация случайных дат из диапазона, как реализовать? antoha73 Общие вопросы Delphi 7 24.03.2010 07:15