上位5つを抽出するには

解決


oishiman  2005-11-09 07:41:40  No: 18529

いつもお世話になっております。
早速ですが,a,b,c,d,e,・・・・zとあるなかで,そこにデータを加えて
(例えばa:=a+1;)として行き,数字が大きい上位5位まで抽出(aなどを
抽出)するにはどうしたらよいのでしょうか?
ちなみに,delphi6personalです。


りおりお  2005-11-09 10:56:17  No: 18530

データの型が不明ですが、一般には、クラスやレコード型にして、そのリストを
TList や TObjectList で保持して、ソートするだけです。

ソートというのは、何らかの論理にしたがって順序づけする手続きです。
TList などのリストクラスでは、ソート自体のアルゴリズムはメソッドとして
ありますので、順序づけする論理の比較関数をユーザが書くだけで使えます。


oishiman  2005-11-09 19:40:39  No: 18531

やっぱりわかりません。
プログラム内で処理したいのですが。
これで,言いたいことが伝わりますでしょうか。


りおりお  2005-11-09 20:52:06  No: 18532

例を挙げます。
新規で Form1 に Memo1、Button1、Button2 をセットし、uses に Contnrs を加えて以下のようにします。

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Contnrs;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    list: TObjectList; // ここは手で書く
    procedure Display; // ここは手で書く
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type                                     // ここは手で書く
TTestRecord = class(TObject)
public
  bango  : integer;
  tokuten: integer;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
  tr: TTestRecord;
begin
  list := TObjectList.Create(true);

  Randomize;
  for i := 0 to 9 do
  begin
    tr := TTestRecord.Create;
    tr.bango := i;
    tr.tokuten := Random(101);
    list.Add(tr);
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  list.Free;
end;

procedure TForm1.Display; // ここは手で書く
var
  i: integer;
  tr: TTestRecord;
begin
  Memo1.Clear;
  for i := 0 to list.Count-1 do
  begin
    tr := TTestRecord(list[i]);
    Memo1.Lines.Add(Format('bango: %.2d  tokuten: %.3d',[tr.Bango, tr.tokuten]))
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Display;
end;

function Koujun(Item1, Item2: Pointer): Integer; // ここは手で書く
begin
  result := TTestRecord(Item2).tokuten - TTestRecord(Item1).tokuten;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  list.Sort(Koujun);
  Display;
end;

end.

Button1 を押すと10人分の番号と得点を Memo1 に表示します。
Button2 を押すと得点の高い方から並べて表示します。


oishiman  2005-11-10 05:08:13  No: 18533

りおりお様ご迷惑をおかけしております。
作りたい内容をお伝えしますと,今ロト6予想ソフトをランダム関数を用いて作成中です。
進捗状況として,数種類の条件をクリアした7個の数字を抽出できるように
しました。
ですが,何分ランダムなので毎回数字が変わります。
そこで,数千回抽出を行い,出現した回数の多い数字を7個選ぼうと考えており,現在に至って降ります。
今一度,ご指導をお願いいたします。


りおりお  2005-11-10 05:29:03  No: 18534

わたし結構数学好きで、確率・統計も成績よかったです。
oishiman さんのつくろうとしているものに価値を見いだせません。ランダムな
ものに意味があるとは思いませんし、ないからこそランダムなのです。
すみませんがアドバイスできません。


oishiman  2005-11-10 17:57:35  No: 18535

了解しました。


残念  2005-11-10 22:08:02  No: 18536

質問者の方のレベルは最初の質問でわかったはず
ソートという言葉も知らないレベルですよ(中高生かも?)
それをあえてレスして最後は考え方がおかしいからもうレスしないとは・・・
傲慢ですね。
りおりおさんがいくら賢くても生まれた時からソートを理解してました?
いやなら放置しておけばよかっただけなのですが


りおりお  2005-11-10 23:25:57  No: 18537

> それをあえてレスして最後は考え方がおかしいからもうレスしないとは・・・
> 傲慢ですね。

そうですね。そうとられても仕方ないです。
ほかの方がレスする分には問題ないです。

残念さんは、確率の「大数の法則」ってご存知ですか?
多数回、乱数を発生させて、ヒストグラムをつくり、その大きい方から5つ選ぶ
ってことがどんな意味をもつのか考えてみるといいと思いますよ。


りおりお  2005-11-10 23:30:27  No: 18538

それからソートについては、すでに具体的にコードをしめしております。


りおりお  2005-11-10 23:37:03  No: 18539

> いやなら放置しておけばよかっただけなのですが

そうでしょうか。わたしは、プログラムコード以前に、考え方そのものが正しくない
場合、そのことを指摘するのは間違いではないと思っております。


ごめんなさい  2005-11-11 01:07:00  No: 18540

私もソートという単語だけ見て一瞬、理解不能でした。
sortと書いてあれば即、理解できたのですけど(苦笑
私は遊びでプログラムを描く事は悪いとは思いませんし、
Hallo World を作る初心者に、価値が無いからヤメロ。
とも言えません。自分も同じ道を通って来たのですから。
完成したexecファイルに価値を見出せなくとも、そのプログラミング行為には
意味があるのでは?みなさんは、そう思いませんか?

さて、oishimanさんの質問への回答ですが、プログラムでの処理とあります。
数学的な考え方で答えると、数字の暫定上位5個(最初はa, b, c, d, e)
を入れ替え候補(f, g, h, i, ... z)と個々に順次比較して、暫定上位より
大きければ入れ替え。すると最後には上位5個が残ります。
更に大きい(小さい)順に並べようと思うのなら、(数字の個数 - 1)回だけ
(aとb,bとc,cとd,dとe)の比較を繰り返せば順番に並びます。
私はこれがoishimanさんの必要とする答えだと、文章から受け取りましたが…
あとは原始的でもいいので、頑張って自力でソースを書いてみて下さい。
きっとできますよ(^^)


りおりお  2005-11-11 01:16:48  No: 18541

> Hallo World を作る初心者に、価値が無いからヤメロ。

わたしは Hallo World プログラムの価値を知っています。
今回の問題はそれとは関係ないと思いますよ。

なにか達成すべき目標があるから、プログラムを作るのでしょう。
達成すべき目的を実現する考え方が間違っている場合は、そのことを
指摘すべきです。

それから、なんども書きますがソートの方法が今回の問題なのではありません。
それは上のコードで解決済みです。

むしろ乱数を多数回発生させてヒストグラムをつくるところなのでは?


りおりお  2005-11-11 01:21:40  No: 18542

>ソートというのは、何らかの論理にしたがって順序づけする手続きです。
>TList などのリストクラスでは、ソート自体のアルゴリズムはメソッドとして
>ありますので、順序づけする論理の比較関数をユーザが書くだけで使えます。

これだけ説明して、そして具体的にコードをしめしていて、なぜソートが未解決だと
思うのか理解に苦しみます。


押し付けは  2005-11-11 02:30:45  No: 18543

よくありませんよ。もう少し、他人の立場を思いやる心をお持ちになっては?
>なにか達成すべき目標があるから、プログラムを作るのでしょう。
>達成すべき目的を実現する考え方が間違っている場合は、そのことを
>指摘すべきです。
oishimanさんの目的は『ロト6予想(もどき)ソフトを作りたい』では?
やりたい事(目的)をハッキリと示しているのに、頭からそれを否定しては・・・
データに裏づけされた予想がしたいとは言っていませんよ?
目的を実現する考え方でなく、目的自体を否定しているのにお気づきですか?

>これだけ説明して、そして具体的にコードをしめしていて、なぜソートが未解決だと
>思うのか理解に苦しみます。
りおりおさんの自己満足はともかく、本人が『やっぱりわかりません。』そして
『今一度,ご指導をお願いいたします。』と礼儀正しくレスしているのに、
何故!?解決だと思うのか、理解に苦しみます。
立場が上位にあるもの(ここでは教える側)が、下位にあるもの(教わる側)に対して
居丈高に解決を強制している図式は、どうなのでしょうね?

先のレスはともかく、今回はスレの趣旨と離れた書き込みですみません<all


メラトニン  2005-11-11 02:59:59  No: 18544

りおりおさんに一票


えーと  2005-11-11 03:18:12  No: 18545

質問者本人が

> 了解しました。

とレスしてることをお忘れなく。


りおりお  2005-11-11 03:20:13  No: 18546

ソートに関しては『やっぱりわかりません。』といってませんね。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加