SKKN Sử dụng hàm sinh số ngẫu nhiên Random tạo test cho một số bài tập cơ bản Tin học 11

SKKN Sử dụng hàm sinh số ngẫu nhiên Random tạo test cho một số bài tập cơ bản Tin học 11

Sự bùng nổ thông tin đã tác động lớn đến công cuộc phát triển kinh tế xã hội người. Với con người của thời đại hiện nay ngoài các kiến thức về chuyên môn thì hầu hết mọi người luôn sử dụng máy tính như một công cụ trợ giúp. Đảng và Nhà nước đã xác định rõ ý nghĩa và tầm quan trọng của tin học và công nghệ thông tin, truyền thông cũng như những yêu cầu đẩy mạnh của ứng dụng công nghệ thông tin, đào tạo nguồn nhân lực đáp ứng yêu cầu công nghiệp hóa, hiện đại hóa, mở cửa và hội nhập, hướng tới nền kinh tế tri thức của nước ta nói riêng – thế giới nói chung.

Chính vì xác định được tầm quan trọng đó nên Nhà nước ta đã đưa môn tin học vào trong nhà trường và ở chương trình THPT tin học còn cho học sinh một vốn kiến thức về công nghệ thông tin và các kỹ năng để có thể làm việc sau khi tốt nghiệp phổ thông.

Học sinh THPT là nguồn lao động trẻ có thể sử dụng ngay sau khi tốt nghiệp do vậy việc được tiếp cận công nghệ thông tin từ trong nhà trường phổ thông sẽ giúp cho học sinh có thể tự tin hơn trong công việc. Trong trường ngoài các tiết lý thuyết về công nghệ thông tin thì việc thực hành đóng một vai trò quan trong và quyết định đến các kỹ năng sau này của học sinh. Từ lâu nay HS có thể rất thuộc lý thuyết nhưng khi bắt tay vào thực tế thì thường rất lúng túng và không có khả năng làm việc theo nhóm độc lập và theo nhóm.

Các bài tập và thực hành trong chương trình lớp 11 giúp học sinh:

+ Biết một số khái niệm cơ bản về lập trình và ngôn ngữ bậc cao

+ Vận dụng các cơ sở dữ liệu và kiến thức về thuật toán

+ Hình thành và phát triển tư duy logic

+ Hình thành các bước để giải quyết vấn đề nêu ra

+ Có thể áp dụng lập trình vào giải các bài toán thực tế

+ Có thái độ ham thích môn học và có tính kỷ luật cao và có khả năng làm việc theo nhóm.

Kiểm tra đánh giá các thuật toán của học sinh thường chỉ được chạy thử với các test nhỏ do vậy không phản ánh được chính xác sự tối ưu của thuật toán. Việc tạo ra các test lớn bằng cách thủ công rất mất thời gian, nhàm chán. Với những lý do trên tôi chọn đề tài về “Sử dụng hàm sinh số ngẫu nhiên Random tạo test cho một số bài tập cơ bản tin học 11”

 

doc 15 trang thuychi01 14383
Bạn đang xem tài liệu "SKKN Sử dụng hàm sinh số ngẫu nhiên Random tạo test cho một số bài tập cơ bản Tin học 11", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
MỤC LỤC
	 	 TRANG
1. MỞ ĐẦU	2
 Lý do chọn đề tài	2
 Mục đích nghiên cứu	2
 Đối tượng nghiên cứu	3
 Phương pháp nghiên cứu	3
2. NỘI DUNG CỦA SÁNG KIẾN KINH NGHIỆM	3
 Cơ sở lý luận của sáng kiến kinh nghiệm	3
Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm	3
Các sáng kiến kinh nghiệm hoặc các giải pháp đã sử dụng 	
để giải quyết vấn đề	4
2.3.1Sinh một số, kí tự ngẫu nhiên.....5
2.3.2 Sinh mảng N số ngẫu nhiên, xâu kí tự có độ dài ngẫu nhiên.6
2.3.3 Sinh ngẫu nhiên tệp7
2.3.4 Một số ví dụ8
Hiệu quả của sáng kiến kinh nghiệm đối với hoạt động 	
giáo dục, với bản thân, đồng nghiệp và nhà trường.	12
3. KẾT LUẬN, KIẾN NGHỊ	12
Kết luận	12
Kiến nghị	12
MỞ ĐẦU
Lý do chọn đề tài:
Sự bùng nổ thông tin đã tác động lớn đến công cuộc phát triển kinh tế xã hội người. Với con người của thời đại hiện nay ngoài các kiến thức về chuyên môn thì hầu hết mọi người luôn sử dụng máy tính như một công cụ trợ giúp. Đảng và Nhà nước đã xác định rõ ý nghĩa và tầm quan trọng của tin học và công nghệ thông tin, truyền thông cũng như những yêu cầu đẩy mạnh của ứng dụng công nghệ thông tin, đào tạo nguồn nhân lực đáp ứng yêu cầu công nghiệp hóa, hiện đại hóa, mở cửa và hội nhập, hướng tới nền kinh tế tri thức của nước ta nói riêng – thế giới nói chung. 
Chính vì xác định được tầm quan trọng đó nên Nhà nước ta đã đưa môn tin học vào trong nhà trường và ở chương trình THPT tin học còn cho học sinh một vốn kiến thức về công nghệ thông tin và các kỹ năng để có thể làm việc sau khi tốt nghiệp phổ thông.
Học sinh THPT là nguồn lao động trẻ có thể sử dụng ngay sau khi tốt nghiệp do vậy việc được tiếp cận công nghệ thông tin từ trong nhà trường phổ thông sẽ giúp cho học sinh có thể tự tin hơn trong công việc. Trong trường ngoài các tiết lý thuyết về công nghệ thông tin thì việc thực hành đóng một vai trò quan trong và quyết định đến các kỹ năng sau này của học sinh. Từ lâu nay HS có thể rất thuộc lý thuyết nhưng khi bắt tay vào thực tế thì thường rất lúng túng và không có khả năng làm việc theo nhóm độc lập và theo nhóm. 
Các bài tập và thực hành trong chương trình lớp 11 giúp học sinh:
+ Biết một số khái niệm cơ bản về lập trình và ngôn ngữ bậc cao
+ Vận dụng các cơ sở dữ liệu và kiến thức về thuật toán
+ Hình thành và phát triển tư duy logic
+ Hình thành các bước để giải quyết vấn đề nêu ra
+ Có thể áp dụng lập trình vào giải các bài toán thực tế
+ Có thái độ ham thích môn học và có tính kỷ luật cao và có khả năng làm việc theo nhóm.
Kiểm tra đánh giá các thuật toán của học sinh thường chỉ được chạy thử với các test nhỏ do vậy không phản ánh được chính xác sự tối ưu của thuật toán. Việc tạo ra các test lớn bằng cách thủ công rất mất thời gian, nhàm chán. Với những lý do trên tôi chọn đề tài về “Sử dụng hàm sinh số ngẫu nhiên Random tạo test cho một số bài tập cơ bản tin học 11” 
Mục đích nghiên cứu.
Đưa ra một số đoạn chương trình tạo những test để chạy thử các bài toán cơ bản và nâng cao trong chương trình lớp 11. Việc tạo test bằng hàm random sẽ nhanh chóng hơn và tùy theo yêu cầu bài toán mà giáo viên có thể định hướng được kết quả theo ý mình. Việc tạo các test lớn cũng sẽ giúp học sinh nhận ra các sai lầm của mình khi thiết kế thuật toán chạy với bộ dữ liệu lớn.
 Đối tượng nghiên cứu.
Học sinh khối 11 trường THPT Nông Cống 1.
Máy tính, máy chiếu để chạy thử.
 Phương pháp nghiên cứu
Phương pháp phân tích thuật toán, kiểm tra đánh giá năng lực học sinh, phát triển tư duy logic. Một số tài liệu tham khảo và tìm kiếm thông tin trên internet.
Nội dung sáng kiến
2.1. Cơ sở lí luận của sáng kiến kinh nghiệm.
Nghị quyết số 29/NQ-TW Hội nghị Trung ương 8 khóa XI về đổi mới căn bản, toàn diện giáo dục và đào tạo nêu rõ: "Tiếp tục đổi mới mạnh mẽ phương pháp dạy và học theo hướng hiện đại; phát huy tính tích cực, chủ động, sáng tạo và vận dụng kiến thức, kỹ năng của người học; khắc phục lối truyền đạt một chiều, ghi nhớ máy móc. Tập trung dạy cách học, cách nghĩ, khuyến khích tự học, tạo cơ sở để người học tự cập nhật và đổi mới tri thức, kỹ năng, phát triển năng lực". Nhận thức được tầm quan trọng của việc tăng cường đổi mới kiểm tra, đánh giá thúc đẩy đổi mới phương pháp dạy học, Sở Giáo dục và Đào tạo đã tập trung chỉ đạo đổi mới các hoạt động này nhằm tạo sự chuyển biến cơ bản về tổ chức hoạt động dạy học, góp phần nâng cao chất lượng giáo dục trong các trường trung học.
+ Chỉ thị 40/CT của Ban bí thư Trung ương Đảng: Đổi mới nội dung chương trình là tích cực áp dụng một cách sáng tạo của phương pháp tiên tiến, hiện đại, ứng dụng công nghệ thông tin vào hoạt động dạy và học...
+ Xã hội hiện nay thì những kiến thức cơ bản về thông tin và các công nghệ cao là những kiến thức rất cần thiết đối với mỗi người nhất là thế hệ trẻ hiện nay.
2.2. Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm.
Việc học ngôn ngữ lập trình pascal giúp học sinh phát triển tư duy khá tốt nhưng việc tạo hứng thú và tạo sự yêu thích môn học cho học sinh lại khó khăn. 
Quá trình thực hiện đề tài tại trường THPT Nông Cống 1 tôi có một số thuận lợi và khó khăn sau:
2.2.1. Thuận lợi:
* Nhà trường:
- Nhà trường đã tạo điều kiện để học sinh có điều kiện tốt nhất để học, tạo điều kiện sắm sửa máy móc, trang thiết bị phục vụ cho việc dạy và học môn Tin học. Nhà trường đã tạo điều kiện tối đa để HS có đủ thời gian và máy móc để thực hành.
- Nhà trường đã có 2 phòng tin (mỗi phòng 25 máy+1 máy chiếu) trong đó có một phòng máy tính xách tay.
* Học sinh:
Đầu vào của học sinh các năm của trường khá cao đó là tiền đề tốt để phát triển môn học lập trình. Đa số học sinh có ý thức học tập và có nhiều em yêu thích môn lập trình.
2.2.2. Khó khăn:
* Nhà trường:
Tuy nhà trường đã có 2 phòng máy nhưng cũng chỉ thực hiện được một phần nào số tiết thực hành vì số lớp đông (24 lớp). 
Nhà trường chưa có giáo viên chuyên trách để quản lý phòng máy nên nhiều lúc máy tính trục trặc không sửa chữa kịp thời. Phòng Thực hành tin học chưa đủ tiêu chuẩn(phòng chật, không thông thoáng) nên cũng gây khó khăn cho các tiết thực hành nhất là những hôm thời tiết quá nóng.
* Giáo viên:
Tài liệu của môn tin học trong nhà trường khá ít do đó gây khó khăn cho việc nâng cao trình độ.
Đời sống giáo viên còn nhiều khó khăn nên việc tập trung tối đa cho môn học cũng bị ảnh hưởng.
* Học sinh:
Lập trình có đặc trưng riêng so với các môn học khác nên sự tiếp cận của học sinh khá khó khăn.
Môn lập trình đòi hỏi phải có máy tính để có thể kiểm tra các chương trình nhưng phần lớn học sinh không có máy tính riêng. Thời gian học cũng khó sắp xếp do vậy nhiều học sinh yêu thích môn tin cũng không có điều kiện phát triển.
Tư tưởng học để thi đại học vẫn còn nặng trong học sinh nên thời gian học các môn không phải môn khối là không đủ để phát triển.
Các sáng kiến kinh nghiệm hoặc các giải pháp đã sử dụng để giải quyết vấn đề.
	Trong ngôn ngữ lập trình Pascal hàm random(N) sinh một số ngẫu nhiên, với N kiểu Word thì thì hàm random(N) sinh một số ngẫu nhiên kiểu nguyên nằm trong khoảng 0 đến N-1. Hàm Random() sinh một số ngẫu nhiên trong đoạn (0..1). Dựa vào hàm Random này tôi đưa ra một số đoạn chương trình tạo một test cho một số bài tập đơn giản và nâng cao trong chương trình lớp 11. Trước khi gọi hàm Random ta cần gọi thủ tục Randomize để máy tính khởi động cơ chế phát sinh số ngẫu nhiên.
Sinh một số, kí tự ngẫu nhiên.
Sinh một số ngẫu nhiên nguyên a không âm
Đoạn chương trình: 
Procedure	sinh(m:integer);
Begin
	Randomize;
	a:= random(m);
end;
Sinh một số ngẫu nhiên a
Đoạn chương trình: 
Procedure	sinh(n,m:integer);
Begin
	Randomize;
	a:= random(m)-random(m);
	end;
Sinh số ngẫu nhiên nguyên từ n đếm m (n<m) như sau:
	Ta có random(m-n+1) sinh số ngẫu nhiên nguyên từ 0 đếm m-n do đó n+random(m-n+1) sinh các số từ n đến n+m-n=m. Từ nhận xét đó ta có đoạn chương trình sau:
Đoạn chương trình: 
Procedure	sinh(n,m:integer);
Begin
	Randomize;
	a:= n+random(m-n);
end;
Sinh một kí tự ngẫu nhiên.
	Ta có các kí tự trong bảng mã ASCII có mã thập phân từ 0 đến 255 do đó ta sử dụng hàm CHR(chuyển sang kí tự tương ứng với số thứ tự). Hàm chuyển như sau.
Đoạn chương trình: 
Function kitungaunhien:char;
Begin
	Kitungaunhien:=CHR(random(255));
End;
	Khi ta muốn sinh ngẫu nhiên các kí tự ‘A’ đến ‘Z’ thì ta có nhận xét: Kí tự ‘A’ có số thứ tự 65 còn ‘Z’ có số thứ tự 90 do đó:
	Kitungaunhien:=CHR(random(25)+60);
	Từ ví dụ trên ta có thể sinh ngẫu nhiên một kí tự trong khoảng nào đó mà đề bài quy định. 
Sinh ngẫu nhiên một số thực.
	Hàm Random(); sinh các số ngẫu nhiên trong khoảng (0,1) do vậy nếu ta chỉ cần sinh các số ngẫu nhiên trong khoảng này thì chỉ cần viết câu lệnh a:=Random(); Nếu ta muốn sinh các số thực ngẫu nhiên lớn hơn một thì ta có thực hiện hàm.
Đoạn chương trình: 
Function sothuc:real;
Begin
	Sothuc:=random()*random(10000);
{nếu số thực âm thì sothuc:=random()*(random(10000)-random(10000));}
End;
	Khi chúng ta thay đổi kiểu dữ liệu và tùy theo bài toán ta có thể tạo ra các test để kiểm tra tính đúng đắn của các bài toán mà học sinh làm. Việc sinh một số ngẫu nhiên, một kí tự ngẫu nhiên sẽ giúp giáo viên tạo các test cho các tập ở chương III(SGK tin học 11) một cách dễ dàng từ đó có thể đánh giá các giải thuật của học sinh một cách chính xác. 
Sinh mảng N số ngẫu nhiên, xâu kí tự có độ dài ngẫu nhiên.
	Sinh ngẫu nhiên N số, kí tự ngẫu nhiên sử dụng kiểu dữ liệu mảng để lưu.
Sinh n số ngẫu nhiên không âm cho
Đoạn chương trình: 
Procedure	sinh(m:word);
Var	i:integer;
Begin
	Randomize;
	For i:=1 to n do a[i]:=random(m);
End;
Sinh n số ngẫu nhiên cho mảng a
Đoạn chương trình: 
Procedure	sinh(m:word);
Var	i:integer;
Begin
	Randomize;
	For i:=1 to n do a[i]:=random(m)-random(m);
End;
Sinh ngẫu nhiên n số nguyên trong khoảng a đến b
	Dựa vào nhận xét của mục a ta có thủ tục sinh ngẫu nhiên n số nguyên từ a đến b(a<b) như sau:
Đoạn chương trình: 
Procedure	sinh(n,a,b:integer);
Var 	i:integer;
Begin
	Randomize;
	For i:=1 to n do songuyen[i]:=a+random(b-a+1);
End;
Sinh ngẫu nhiên N số thực cho mảng
	Sử dụng đoạn chương trình sinh một số thực ở mục a ta sẽ có một mảng ngẫu nhiên gồm n số thực.
Đoạn chương trình: 
Function sothuc:real;
Var i:integer;
Begin
	For i:=1 to n do	
	 Sothuc[i]:=random()*random(10000);
	{số thực âm thì sothuc[i]:=random()*(random(10000)-random(10000));}
End;
Sinh xâu kí tự có độ dài ngẫu nhiên.
	Trong các bài toán xử lí xâu chúng ta thường tạo các test có số lượng kí tự nhỏ vì việc gõ các test có lượng kí tự lớn rất mất thời gian và nhàm chán. Từ đó dễ dẫn đến không kiểm tra được độ chính xác của giải thuật khi xử lý xâu lớn và không kiểm tra đúng đắn thời gian chạy(có thể giải thuật sẽ tốn rất nhiều thời gian); đối với việc bồi dưỡng học sinh giỏi thì thời gian chạy cũng rất quan trọng. Sau đây tôi sẽ đưa ra một hàm tạo một xâu ngẫu nhiên gồm các kí tự từ ‘A’ đến ‘Z’ các trường hợp còn lại làm tương tự.
Đoạn chương trình.
Function	xaungaunhien:ansistring;
Var 	i,n:word;
Begin
	Xaungaunhien:=’’;
	N:=1+random(500);
	For i:=1 to n do 
	xaungaunhien:=xaungaunhien+chr(random(25)+65);
End;
	Nhận xét: Từ các đoạn chương trình trên ta có thể tạo ra các bộ test cho các bài toán cơ bản trong chương IV(SGK tin học 11). 
Sinh tệp ngẫu nhiên.
	Sử dụng các đoạn chương trình ở mục a, b ta có thể lưu các giá trị ngẫu nhiên sinh ra vào các tệp. Việc làm này sẽ giúp cho giáo viên dễ dàng hơn trong việc kiểm tra và bồi dưỡng học sinh giỏi(việc tạo các tệp để test giúp chấm bằng phần mềm tự động dễ dàng và nhanh chóng). 
	Sau khi có input bằng cách sinh số ngẫu nhiên ta chạy code của mình để sinh output.
VD1: Tạo tệp chứa các số nguyên dương, mỗi số cách nhau bởi dấu cách.
Đoạn chương trình: 
Procedure	sinh(m:word);
Var	i:integer;
Begin
	Randomize;
	For i:=1 to n do Write(f1,a[i]:=random(m)),’ ‘);
End;
VD2: Tạo tệp chứa xâu kí tự gồm các kí tự từ ‘A’ đến ‘Z’ có độ dài ngẫu nhiên(sử dụng đoạn chương trình ở muc 2.3.2) 
Đoạn chương trình.
Function	xaungaunhien:ansistring;
Var 	i,n:word;
	F1:text;
Begin
	Assign(f1,’xaukitu.inp’);rewrite(f1);
	Xaungaunhien:=’’;
	N:=1+random(500);
	For i:=1 to n do 
	xaungaunhien:=xaungaunhien+chr(random(25)+65);
	write(f1,xaungaunhien);
close(f1);
End;
Một số ví dụ.
	Dựa trên các hàm và thủ tục đã trình bày ở mục 2.3.3 tôi đưa ra một số bài toán hay dùng trong chương trình. 
Bài toán 1: Sinh một mảng ngẫu nhiên tăng.
Thuật toán: 
	- Sinh ngẫu nhiên phần tử đầu tiên: a[1]:=random(n);
	- Phần tử thứ 2 trở đi thì được sinh bằng phần tử trước đó cộng thêm một lượng ngẫu nhiên: a[i]:=a[i-1]+random(n);
Đoạn chương trình:
Procedure 	sinh(n:integer);
Var	i:integer;
Begin
	Randomize;
	a[1]:=random(n);
	for i:=2 to n do a[i]:=a[i-1]+random(n);
end;
	{chương trình chính ta chỉ cần gọi sinh(n) để tạo mảng tăng dần}
Nhận xét: Từ bài toán này ta có thể sinh tệp ngẫu nhiên tăng như sau:
Procedure 	sinh(n:integer);
Var	f:text;
	i:integer;
	x:longint;
Begin
	Randomize;
	Assign(f,fi);{fi được khai báo với một tên tệp cho trước}
	x:=random(n);
	for i:=2 to n do 
 	 	 begin
	x:=x+random(n);
	write(f,x,’ ‘);
end;
	end;
Bài tập áp dụng: Sinh mảng giảm dần.
Bài toán 2: Sinh tệp cấp số cộng (Tạo test bài 5 trang 79 SGK tin học 11)
Thuật toán:
 Sinh số hạng đầu tiên và công sai d như sau: x:=random(n); d:=random(n)+1;
Từ số thứ 2 sinh bằng cách lấy số trước đó cộng với d.
Đoạn chương trình:
Procedure 	sinh(n:integer);
Var	f:text;
	i,d:integer;
	x:longint;
Begin
	Randomize;
	Assign(f,fi);{fi được khai báo với một tên tệp cho trước}
	x:=random(n);
	d:=random(n)+1; {cộng thêm 1 để tránh trường hợp d=0}
	for i:=2 to n do 
 	 begin
	x:=x+random(n);
	write(f,x,’ ‘);
 end;
end;
Nhận xét: Từ bài toán sinh mảng cấp số cộng ta có thể sinh mảng cấp số nhân một cách dễ dàng.
Bài toán 3: Sinh ngẫu nhiên mảng có tỉ lệ 1:k
Thuật toán: 
	- t:=sum(a[1..n]) {t là tổng các số}
	- Muốn chia mảnh thành hai phần a[1..i] và a[i+1..n] có tổng gấp nhau k lần thì ta phải có:
	+ Tổng các số phải chia hết cho (k+1): Giả sử t1=t div (k+1) và tk=t-t1;
	+ Nếu tồn tại i (i<=i<=n) thì sum(a[1..i])=t1 hoặc sum(a[1..i])=tk.
	Ta chọn d=random(m div 2)+1 là điểm chia hai phần. Ta lại chọn ngẫu nhiên một trong hai trường hợp.
	Trường hợp 1: Đoạn a[1..d] bằng k lần đoạn còn lại.
	Trường hợp 2: Đoạn a[(d+1)..n] bằng k lần đoạn a[1..d].
Đoạn chương trình:
Procedure	Sinh(m,k:word);
Var 	i,d,t:longint;
Begin
 d:=random(m div 2)+1;
	{d là điểm chia và trong khoảng từ 1 đến m div 2 - 1}
	for i:=1 to d do
	 	begin
 	a[i]:=random(m);
	t:=t+a[i];
	 	 end;
	if random(2)=0 then a[d]:=a[d]+ (k-1)*t 
	{đoạn a[1..d] gấp k lần đoạn a[(d+1)..n]}
	else t:=t*k; {đoạn a[(d+1)..n] gấp k lần đoạn a[1..d]}
	if i:=d+1 to n-1 do
 	 begin
	a[i]:=random(t);
	t:=t=a[i];
	 	 end;
	a[n]:=t;
end;
Nhận xét: Nếu k=1 thì bài toán trở thành bài toán chia tỉ lệ 1:1;
Bài toán 4: Sinh ngẫu nhiên đều.
	Bài toán sinh ngẫu nhiên mảng nguyên a n phần tử tạo thành k đoạn liên tiếp có tổng bằng nhau.
Thuật toán:
	Chọn ngẫu nhiên số lượng phần tử trong đoạn là random(n div k)+1, khi đó số lượng các phần tử phát sinh sẽ không vượt quá k*(n div k)<=n. Sau đó ta chỉnh cho số lượng đúng bằng n.
	- Giả sử a[c..d] là đoạn thứ i cần sinh ngẫu nhiên sao cho:
	a[c]+a[c+1]+a[c+2]+..+a[d]=t;
	- Ta sinh đoạn này như sau(ta làm tương tự như bài toán 3)
	+ Gán t1:=t;{t1 là giá trị còn lại của tổng trong đoạn}
	+ Gán giá trị ngẫu nhiên từ 0 đến t1 cho các phần tử a[c..d-1]
	+ Đồng thời chỉnh giá trị còn lại của tổng đoạn: t1:=t1-a[i] (với i =c..d-1)
	Khi đó thì ta có: a[c]+a[c+1]+a[c+2]+..+a[d-1]<t.
	+ Ta đặt giá trị còn lại của tổng đoạn vào phần tử cuối: a[d]:=t1;
Đoạn chương trình.
Procedure	sinh(n,k,t;integer);
Var	i,j,p,s,t1:integer;
Begin
	S:=n div k;{s là số phần tử tối đa trong đoạn}
	i:=0;
	for j:=1 to k do {sinh đoạn thứ j}
	begin
	t1:=t;
	for p:=1 to random(s) do
	begin
	inc(i);
	a[i]:=random(t1);
	t1:=t1-a[i];
	end;
	inc(i); {phần tử cuối của đoạn}
	a[i]:=t1;
	end;
	for i:=i+1 to n do a[i]:=0;{ các phần tử còn lại để giá trị bằng 0}
end;
Bài toán 5: Sinh ngẫu nhiên xâu đối xứng.
	Bài toán kiểm tra một xâu có phải là xâu đối xứng hay không rất thường gặp trong các đề thi do vậy việc tạo các test để kiểm tra cũng rất cần thiết.
 	Việc tạo các xâu không đối xứng khá đơn giản ta chỉ cần sinh xâu ngẫu nhiên là được khi đó tỉ lệ xâu không đối xứng là rất cao. Do vậy ở đây tôi chỉ trình bày sinh một xâu đối xứng.
Thuật toán:
	+ Sinh ngẫu nhiên các kí tự trong bảng mã ASCII từ kí tự có số thứ tự 34 trở đi.
	Nếu n chẵn thì ta sinh ngẫu nhiên xâu có độ dài n div 2 sau đó gán giá trị cho phần còn lại của xâu bằng xâu đảo ngược của xâu mới sinh ra.
	Nếu n lẻ thì ta sinh ngẫu nhiên xâu có độ dài (n-1) div 2 kí tự giữa ta chọn một kí tự ngẫu nhiên sau đó ta gán giá trị cho phần còn lại.
Đoạn chương trình: 
procedure	xaungaunhien(n:integer; st:ansistring);
Var 	i,n:word; 
	Xau:ansistring;
Begin
	Xau:=’’;
	If n mod 2 =0 then
	Begin
	For i:=1 to n div 2 do xau:=xau+chr(random(221)+34);
	St:=xau;
	For i:= n div 2 downto n do st:=st+xau[i];
	End
	Else 
	Begin
	For i:=1 to (n-1) div 2 do xau:=xau+chr(random(221)+34);
	St:=xau+chr(random(221)+34);
	For i:= (n-1) div 2 downto n do st:=st+xau[i];
	End;
End;
2.4. Hiệu quả của sáng kiến kinh nghiệm đối với hoạt động giáo dục, với bản thân, đồng nghiệp và nhà trường.
	Sau qua trình áp dụng đề tài vào giảng dạy, việc đánh giá, tinh chỉnh thuật toán của học sinh khá tốt. Trong quá trình dạy thì việc kiểm thử kết quả của học sinh là rất quan trọng từ đó có thể rút ra rất nhiều kinh nghiệm trong việc xử lý nhất là xử lý số lớn. Việc sử dụng hàm random tạo các test giúp giáo viên có thể tạo ra các test lớn một cách nhanh chóng qua đó việc kiểm tra đánh giá cũng hiệu quả hơn. Trong quá trình học sinh làm bài thường chỉ kiểm tra các test nhỏ do đó việc kiểm tra thuật toán có tính đúng đắn với các trường hợp khác mang tính cảm tính và cho rằng thuật toán là đúng. Tuy nhiên nhiều trường hợp thuật toán đó chỉ đúng với một vài test nhỏ còn khi chạy các test lớn hơn sẽ gặp nhiều khó khăn như: về kiểu dữ liệu, thời gian Trong qua trình dạy các lớp khối 11 giúp học sinh phân tích các ý tưởng thuật toán của mình một cách logic hơn và giúp học sinh có cách suy nghĩ bao quát vấn đề, tưu duy tốt hơn. 
	Đối với việc bồi dưỡng học sinh giỏi thì việc tạo các test lớn giúp giáo viên và học sinh chỉ ra được nhiều vấn đề để điều chỉnh thuật toán, các lỗi thường gặp khi chạy với bộ test lớn. Từ đó học sinh sẽ không bị mất điểm một cách đáng tiếc trong các kỳ thi. Trong qua trình dạy bồi dưỡng học sinh khi áp dụng đề tài này tôi cũng thu được nhiều kinh nghiệm quý từ đó có kết quả khá tốt. Cụ thể
Năm 2012-2013: Đạt 3 giải (1 ba, 2 khuyến khích)
Năm 2013-2014: Đạt 2 giải (1 nhì, 1 khuyến khích)
Năm 2015-2016: Đạt 2 giải (1 nhì, 1 ba) 
3. KẾT LUẬN, KIẾN NGHỊ
1. Kết luận
	 Thông qua sử dụng hàm sinh số ngẫu nhiên Random tạo test cho một số bài tập cơ bản:
	Học sinh và giáo viên đánh giá và lựa chọn được các phương án tối ưu để giải quyết các bài toán. Việc kiểm thử với các test lớn giúp học sinh trưởng thành hơn trong cách tư duy thuật toán, đúc kết nhiều kinh nghiệm trong quá trình thực hiện chương trình.
Từ việc kiểm tra đánh giá học sinh giáo viên cũng rút ra được nhiều kinh nghiệm và biết được cách suy nghĩ của học sinh từ đó điều chỉnh học sinh đi đúng hướng. Tạo được kinh nghiệm quý báu cho các năm học tiếp theo.
Kiến nghị
	Để tạo được nguồn lao động trẻ có chất lượng cao trong ngành công nghệ thông tin thì ngay trong khi học THPT việc đầu tư cơ sở vật chất và áp dụng công nghệ vào giảng dạy là rất quan trọng. Do vậy tôi kiến nghị các cấp, các ngành có cơ chế tạo điều kiện xây dựng cơ sở vật chất và thời lượng chương trình để phát triển môn lập trình trong trường THPT. 
	Trên đây là một số kinh nghiệm của tôi khi dạy chương trình tin học 11 và bồi dưỡng học sinh giỏi. Tuy chỉ là một phần rất nhỏ về cách tạo một số test cơ bản để đánh giá các thuật toán của họ

Tài liệu đính kèm:

  • docskkn_su_dung_ham_sinh_so_ngau_nhien_random_tao_test_cho_mot.doc