[Ruby Programming] ถ้าต้องการให้ตัวเลขที่ random นั้นมันถูก sort ตามฟังก์ชันที่เขียนไว้จะต้องทำยังไงเหรอค่ะ ช่วยตอบด้วยนะค่ะ

  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.
  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.

[Ruby Program] ถ้าต้องการให้ข้อมูลที่ random เก็บไว้ใน array arr นั้นถูก sort ตามฟังก์ชันที่เขียนไว้จะต้องทำยังไงเหรอค่ะ
เนื่องจากโปรแกรมที่ให้ดูมันไม่ sort แต่จะแสดงค่าที่ random ให้เพียงเท่านั้นค่ะ ขอบคุณสำหรับผู้ที่ช่วยตอบคำถามนี้ล่วงหน้านะค่ะ

def sort(array)
def min(array, from)
min_val = array[from..-1].min
min_idx = array[from..-1].index(min_val) + from
return min_idx
end

array.each_with_index { |v, i|
min_idx = min(array, i)

tmp = array[i]
array[i] = array[min_idx]
array[min_idx] = tmp
}
array
end

def random_number
arr=[]
arr<< rand
end

100.times { puts random_number }

#p sort(arr)

ลองดูแบบนี้มั้ย?
(1..10).collect {|i| i*rand }.sort!

sugree's picture

การบ้านเขียน sort มั๊ง ถ้าส่งแบบนี้อาจารย์จะว่าไงเนี่ย

อ๋ออออ......
ข้าน้อยผิดเอง 55+

งั้นเปลี่ยนเป็น ลอง bubble แบบนี้มั้ย

@a = []
10.times{ @a << rand}
 
def sort(array)
   i = 0
   (0..array.size).each do
    j = array.size - 1
    until (i >= j)
      if array[j] < array[j - 1]
        tmp = array[j]
        array[j] = array[j - 1]
        array[j - 1] = tmp
      end
      j -= 1
    end
    i += 1
  end
 
  return array
end
 
p sort(@a)
sugree's picture

เอามั่ง

#!/usr/bin/env python
 
import random
 
def sort(a):
    for i in range(len(a)):
        for j in range(len(a)-1, i-1, -1):
            if a[j] < a[j-1]:
                a[j], a[j-1] = a[j-1], a[j]
    return a
 
a = [random.random() for i in range(10)]
print a
print sort(a)

เจ้า @a หมายถึงอะไรอะครับ

ช่วง swap สามารถเขียนแบบนี้ได้ (ทำนองเดียวกับ python)

array[j], array[j-1] = array[j-1], array[j] if array[j] < array[j-1]

ประโยคประกาศตัวแปร i กับ increment i มันเกินมานะ
เนื่องจากเราใช้ each กับ Range อยู่แล้ว
น่าจะเขียนแบบนี้ไปเลย

(0..array.size).each do |i|

ผมมั่วเอง - -'
งั้นลอก Python ข้างบนละกัน.. ดูดี

def sort(array)
   for i in (0..array.size - 1) do
    for j in (0..array.size - i - 2) do
      array[j], array[j + 1] = array[j + 1], array[j] if array[j] > array[j + 1]
    end
   end
  return array
end
 
p sort(Array.new(10) {rand})

ขำ ๆ สุ่มไป เรียงไป

import random
 
def sortrand(dim):
	a = range(dim)
	a[0] = random.randint(1,20)
	a = [float(random.randint(a[i-1],a[i-1]+20)) for i in range(1,dim+1)]
	a = [a[i] / (a[dim-2]+20) for i in range(dim) ]
	return a
 
sortrand(100000)

? sort ตอนไหน

sugree's picture

ตอน randint() ใส่ขอบเขตแบบที่สุ่มออกมายังไงก็เรียงตั้งแต่ต้น (รึเปล่า)

ถ... ถูกต้องนะคร้าบบบ

random.randint(a[i-1],a[i-1]+20)

ค่าต่ำสุดของการสุ่มคือค่าก่อนหน้า a[i-1] ค่าสูงสุดคือ a[i-1]+20 ครับ

เข้าใจแล้ว
ผมลองสั่ง run โดยใช้ dimension น้อยไป (ลองที่ 10) มันก็เลยมีโอกาสได้ผลลัพท์ที่ไม่เรียง

>>> sortrand(10)
[0.63043478260869568, 0.19565217391304349, 0.41304347826086957, 0.17391304347826086, 0.32608695652173914, 0.45652173913043476, 0.19565217391304349, 0.21739130434782608, 0.56521739130434778, 0.39130434782608697]
>>> sortrand(10)
[0.066666666666666666, 0.15555555555555556, 0.20000000000000001, 0.46666666666666667, 0.24444444444444444, 0.22222222222222221, 0.28888888888888886, 0.44444444444444442, 0.55555555555555558, 0.51111111111111107]

โปรแกรมผิดเองครับ เพราะผมเขียนแบบนี้ก่อน

import random
 
def sortrand(dim):
	a = range(dim)
	a[0] = random.randint(1,20)
	for i in range(1,dim):
		a[i] = float(random.randint(a[i-1],a[i-1]+20))
	a = [a[i] / (a[dim-2]+20) for i in range(dim) ]
	return a

แล้วไปเปลี่ยนรูปแบบ for ทีหลัง แล้วดันใส่ dimension เสียเยอะ เลยตรวจสอบไม่ดี

a = [float(random.randint(a[i-1],a[i-1]+20)) for i in range(1,dim+1)]

มันยังเอาค่าของ a มาจาก range อยู่ มันเลยมีข้อผิดพลาดครับ เพราะมันไม่ recursive ต้องเปลี่ยนตรง range เป็น

a = range(1,dim*21,21)

ถึงจะใช้ได้

แก้ตัวโค้ดแรกครับ

import random
 
def sortrand(dim):
	a = range(1,dim*21,21)
	a[0] = random.randint(1,20)
	a = [float(random.randint(a[i-1],a[i-1]+20)) for i in range(1,dim+1)]
	a = [a[i] / (a[dim-2]+20) for i in range(dim) ]
	return a

เพราะว่า ตอน sort กับ ตอน generate เลข random
arr มันเป็นคนละตัวกัน

arr ของหนู ประกาศไว้ใน scope ของ function มันจึงเรียกใช้งานได้จากใน function เท่านั้น
พอตอนสั่ง p sort(arr) มันก็เลยเกิด error undefined local variable or method `arr'

ขอบคุณมากๆนะค่ะ สำหรับทุกๆความคิดเห็น ตอนนี้ทำได้แล้วค่ะ

ย้าย Codenone

ประกาศย้าย Codenone ไปใช้ Forum ของ Blognone แทนครับ ตามไปตั้งกระทู้ต่อได้ที่ Codenone Forum (รายละเอียดอ่านจากกระทู้ ย้าย Codenone ไปรวมกับ Blognone)

กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น